这个问题是我之前问题的续集。该站点上的用户帮助我确定了如何编写一个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"
?我用|
错了吗?
我经常使用该程序,nohup
以便我的进程不受挂断的影响。所以如果我想让程序program
免于挂断,我使用命令
nohup program &
Run Code Online (Sandbox Code Playgroud)
其中,&
并将其进程在后台运行。
启动时,nohup
给我信息:
nohup:将输出附加到 `nohup.out'
有没有办法将输出发送到文件以外的文件nohup.out
?我经常想使用 运行同一目录中的多个进程nohup
,但如果我这样做,所有输出都会集中在一个nohup.out
文件中。
手册页(例如,here)似乎没有指定日志文件的选项。你能确认一下吗?另外,您对我如何解决这个问题有什么想法吗?
我有以下 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
循环以使其正常工作吗?谢谢你的时间。
是否可以列出硬盘驱动器上最大的文件?我经常df -H
用来显示我的磁盘使用情况,但这只会给出已满的百分比、剩余的 GB 等。
我进行了大量数据密集型计算,其中包含大量小文件和极少数非常大的文件。由于我使用的大部分磁盘空间都在极少数文件中,因此很难追踪这些大文件的位置。删除 1 kB 文件不会释放太多空间,但删除 100 GB 文件可以。有没有办法根据大小对硬盘驱动器上的文件进行排序?
谢谢。
我是一名计算科学家,我在 Linux 上运行了很多冗长的计算。具体来说,我使用GROMACS 包运行分子动力学 (MD) 模拟。 这些模拟可能需要数天或数周的时间,在(例如)8 到 24 个内核上运行。我可以访问集群的多个节点,这意味着在任何给定时间,我都在运行大约 4 或 5 个作业(每个在不同的节点上,每个在 8-24 个内核上)。
问题是模拟花费的时间是可变的。我喜欢让所有节点全天候进行模拟,但要开始新的模拟,我需要使用终端登录并进行一些手动工作。但我总是忘记模拟还剩下多少时间,所以我总是不断地检查它们。
有什么方法可以在 Linux 进程完成时接收电子邮件?有没有一个 Linux 程序可以做到这一点?这样我就知道什么时候用终端登录并准备下一次模拟。
我正在使用 Ubuntu Linux。谢谢你的时间。
如果我将当前/工作目录(使用 导航到它cd
)设置为某个特定目录,然后键入:
rm *.xvg
Run Code Online (Sandbox Code Playgroud)
这个命令会做什么?这是真的,上面的命令将只删除文件扩展名为.xvg
只有在工作目录?
在询问之前,我对尝试此操作感到紧张,因为我想绝对确定上述命令只会删除位于 WORKING DIRECTORY 中的.xvg
文件。
我是研究生,我所在的小组维护一个 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
我可以使用任何标志来加速复制?)即使我可以以某种方式将这个复制时间缩短一分钟,这也会有很大帮助。
我确信购买新的、速度更快的硬件磁盘,但我无法访问此类资源。我也不是系统管理员——我只是一个(新手)用户——所以我无法访问有关磁盘负载的更详细信息。我知道虽然每天大约有十几个人使用文件服务器,但我是唯一使用这个特定节点/本地磁盘的人。
假设我有一个包含.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文件之外的所有内容?似乎我需要在find
or 中使用某种逻辑“或” grep
。
我想将具有多个扩展名的文件复制到一个目标目录。
例如,我可以使用以下命令将工作目录中的所有.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
或模式的文件复制*.png
到destination
? 理想情况下,我希望能够指定两个以上的模式——例如,指示cp
将所有*.txt
或 *.png
或 *.jpg
文件复制到destination
。
我确信所有这些都可以使用 shell 脚本实现——bash
例如,我正在使用——但是有没有什么方法可以更简单地完成它,仅从控制台?我可以以某种方式使用大括号扩展来做到这一点吗?
我知道这是可能的所有文件复制除了匹配某些特定模式的工作目录,但由于我的工作目录含有更多的文件扩展名,我不希望比我复制这样做,那将是一个痛苦。
你对此有什么想法吗?
在 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
吗?感谢您的时间。