小编And*_*rew的帖子

在 bash 脚本中,在“if”语句中使用条件“or”

这个问题是我之前问题的续集。该站点上的用户帮助我确定了如何编写一个for遍历字符串值的 bash循环。例如,假设循环控制变量fname遍历字符串"a.txt" "b.txt" "c.txt"。我想echo“是的!” 何时fname具有值"a.txt"or "c.txt",并且echo“不!” 除此以外。我尝试了以下 bash shell 脚本:

#!/bin/bash

for fname in "a.txt" "b.txt" "c.txt"
do
  echo $fname
  if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
    echo "yes!"
  else
    echo "no!"
  fi
done
Run Code Online (Sandbox Code Playgroud)

我获得输出:

一个.txt

不!

b.txt

不!

文件

是的!

为什么该if语句在fname具有 value时显然会产生 true "a.txt"?我用|错了吗?

bash shell-script

329
推荐指数
3
解决办法
91万
查看次数

有没有办法将 nohup 输出重定向到 nohup.out 以外的日志文件?

我经常使用该程序,nohup以便我的进程不受挂断的影响。所以如果我想让程序program免于挂断,我使用命令

nohup program &
Run Code Online (Sandbox Code Playgroud)

其中,&并将其进程在后台运行。

启动时,nohup给我信息:

nohup:将输出附加到 `nohup.out'

有没有办法将输出发送到文件以外的文件nohup.out?我经常想使用 运行同一目录中的多个进程nohup,但如果我这样做,所有输出都会集中在一个nohup.out文件中。

手册页(例如,here)似乎没有指定日志文件的选项。你能确认一下吗?另外,您对我如何解决这个问题有什么想法吗?

io-redirection nohup

162
推荐指数
3
解决办法
36万
查看次数

在bash中,是否可以在大括号扩展中使用整数变量

我有以下 bash 脚本:

#!/bin/bash

upperlim=10

for i in {0..10}
do
echo $i
done

for i in {0..$upperlim}
do
echo $i
done
Run Code Online (Sandbox Code Playgroud)

第一for回路(没有变量upperlim中的循环控制)工作正常,但所述第二for环路(可变upperlim的循环控制)没有。有什么办法可以修改第二个for循环以使其正常工作吗?谢谢你的时间。

shell bash shell-script for

78
推荐指数
3
解决办法
8万
查看次数

查找使用最多磁盘空间的文件

是否可以列出硬盘驱动器上最大的文件?我经常df -H用来显示我的磁盘使用情况,但这只会给出已满的百分比、剩余的 GB 等。

我进行了大量数据密集型计算,其中包含大量小文件和极少数非常大的文件。由于我使用的大部分磁盘空间都在极少数文件中,因此很难追踪这些大文件的位置。删除 1 kB 文件不会释放太多空间,但删除 100 GB 文件可以。有没有办法根据大小对硬盘驱动器上的文件进行排序?

谢谢。

linux ubuntu df

57
推荐指数
3
解决办法
25万
查看次数

是否有程序可以在进程完成时向我发送通知电子邮件?

我是一名计算科学家,我在 Linux 上运行了很多冗长的计算。具体来说,我使用GROMACS 包运行分子动力学 (MD) 模拟 这些模拟可能需要数天或数周的时间,在(例如)8 到 24 个内核上运行。我可以访问集群的多个节点,这意味着在任何给定时间,我都在运行大约 4 或 5 个作业(每个在不同的节点上,每个在 8-24 个内核上)。

问题是模拟花费的时间是可变的。我喜欢让所有节点全天候进行模拟,但要开始新的模拟,我需要使用终端登录并进行一些手动工作。但我总是忘记模拟还剩下多少时间,所以我总是不断地检查它们。

有什么方法可以在 Linux 进程完成时接收电子邮件?有没有一个 Linux 程序可以做到这一点?这样我就知道什么时候用终端登录并准备下一次模拟。

我正在使用 Ubuntu Linux。谢谢你的时间。

shell process email

51
推荐指数
5
解决办法
6万
查看次数

如何删除特定文件夹中具有特定扩展名的所有文件?

如果我将当前/工作目录(使用 导航到它cd)设置为某个特定目录,然后键入:

rm *.xvg
Run Code Online (Sandbox Code Playgroud)

这个命令会做什么?这是真的,上面的命令将删除文件扩展名为.xvg 只有在工作目录?

在询问之前,我对尝试此操作感到紧张,因为我想绝对确定上述命令只会删除位于 WORKING DIRECTORY 中的.xvg文件。

shell bash directory rm

47
推荐指数
2
解决办法
21万
查看次数

有没有更快的 cp 替代品来复制大文件(~20 GB)?

我是研究生,我所在的小组维护一个 Linux 集群。集群的每个节点都有自己的本地磁盘,但是这些本地磁盘比较小,没有配备自动备份。因此,该组拥有一个具有许多 TB 存储空间的文件服务器。我是一个相对的 Linux 新手,所以我不确定文件服务器在速度、网络能力等方面的规格是什么。我从经验中知道本地磁盘在 I/O 方面比文件服务器快得多. 大约有十几个人使用文件服务器。

使用cp将大约 20 GB 的文件从文件服务器复制到其中一个本地磁盘平均需要大约 11.5 分钟的实时时间(根据time)。我知道这个cp操作效率不高,因为(1)time告诉我这样一个副本的系统时间只有~45秒;并且因为 (2) 当我top在复制过程中检查时,%CPU非常低(通过检查,平均约为0-10%)。

使用cp将相同的 ~20 GB 文件从本地磁盘上的一个文件夹复制到同一本地磁盘上的另一个文件夹需要更少的时间 - 实时大约 9 分钟(系统时间约为 51 秒,根据time)。因此,显然文件服务器比本地磁盘慢一些,正如预期的那样,但可能不会明显变慢。我很惊讶从本地复制到同一本地的速度不超过 9 分钟。

我需要将 ~200 个大文件(每个 ~20 GB)从文件服务器复制到本地磁盘之一。所以,我的问题是:在 Linux 中复制大文件有没有更快的替代方法cp (或者cp我可以使用任何标志来加速复制?)即使我可以以某种方式将这个复制时间缩短一分钟,这也会有很大帮助。

我确信购买新的、速度更快的硬件磁盘,但我无法访问此类资源。我也不是系统管理员——我只是一个(新手)用户——所以我无法访问有关磁盘负载的更详细信息。我知道虽然每天大约有十几个人使用文件服务器,但我是唯一使用这个特定节点/本地磁盘的人。

cp file-copy

45
推荐指数
7
解决办法
12万
查看次数

如何列出目录中除具有指定扩展名的文件之外的每个文件?

假设我有一个包含.txt.pdf和其他文件的文件夹。我想列出“其他”文件(即没有扩展名的文件.txt.pdf)。你对如何做到这一点有什么建议吗?

我知道如何列出没有给定扩展名的文件。例如,如果我想列出除.txt文件之外的所有文件,那么要么

find -not -iname "*.txt"
Run Code Online (Sandbox Code Playgroud)

或者

ls | grep -v '\.txt$' | column
Run Code Online (Sandbox Code Playgroud)

似乎工作。但是,如何列出除.txt文件 .pdf文件之外的所有内容?似乎我需要在findor 中使用某种逻辑“或” grep

ls grep find

43
推荐指数
5
解决办法
12万
查看次数

复制具有多个扩展名的文件

我想将具有多个扩展名的文件复制到一个目标目录。

例如,我可以使用以下命令将工作目录中的所有.txt文件复制到名为 的目录destination

cp -v *.txt destination/
Run Code Online (Sandbox Code Playgroud)

我可以使用以下内容将工作目录中的所有.png目录复制到destination

cp -v *.png destination/
Run Code Online (Sandbox Code Playgroud)

但是将它们作为单独的命令键入很耗时(即使使用命令历史记录)。那么,有什么方法可以告诉我cp将带有模式*.txt 模式的文件复制*.pngdestination 理想情况下,我希望能够指定两个以上的模式——例如,指示cp将所有*.txt *.png *.jpg文件复制到destination

我确信所有这些都可以使用 shell 脚本实现——bash例如,我正在使用——但是有没有什么方法可以更简单地完成它,仅从控制台?我可以以某种方式使用大括号扩展来做到这一点吗?

我知道这是可能的所有文件复制除了匹配某些特定模式的工作目录,但由于我的工作目录含有更多的文件扩展名,我希望比我复制这样做,那将是一个痛苦。

你对此有什么想法吗?

shell bash cp wildcards

34
推荐指数
1
解决办法
4万
查看次数

在 bash shell 脚本中,编写一个遍历字符串值的 for 循环

在 bash 中,我知道可以编写一个for循环,其中一些循环控制变量i迭代指定的整数。例如,我可以编写一个 bash shell 脚本来打印 1 到 10 之间的整数:

#!/bin/bash

for i in {1..10}
do
 echo $i
done
Run Code Online (Sandbox Code Playgroud)

如果我提供字符串列表,是否可以迭代作为字符串的循环控制变量?例如,假设我有一个fname表示文件名的字符串。我想为每个文件名调用一组命令。例如,我可能想fname使用这样的命令打印内容:

#!/bin/bash

for fname in {"a.txt", "b.txt", "c.txt"}
do
 echo $fname
done
Run Code Online (Sandbox Code Playgroud)

换句话说,在第一次迭代时,fname应该有 value fname="a.txt",而在第二次迭代时,fname应该有 value fname="b.txt",依此类推。不幸的是,上面的语法似乎不太正确。我想获得输出:

一个.txt

b.txt

文件

但是当我尝试上面的代码时,我得到了这个输出:

{a.txt,

b.txt,

c.txt}

你能帮我确定正确的语法,以便我可以迭代地更改变量的值/内容fname吗?感谢您的时间。

bash shell-script for

28
推荐指数
1
解决办法
9万
查看次数

标签 统计

bash ×5

shell ×4

shell-script ×3

cp ×2

for ×2

df ×1

directory ×1

email ×1

file-copy ×1

find ×1

grep ×1

io-redirection ×1

linux ×1

ls ×1

nohup ×1

process ×1

rm ×1

ubuntu ×1

wildcards ×1