在当前目录下执行每个文件的命令。

27

如何在当前文件夹中为每个文件/文件夹执行特定命令?

我已经使用这个基本脚本开始了,但似乎它只能在使用临时文件时才会工作,而我不太喜欢这个想法。还有其他方法吗?

FOLDER=".";
DIRS=`ls -1 "$FOLDER">/tmp/DIRS`;

echo >"/tmp/DIRS1";
while read line ; do
    SIZE=`du "$FOLDER$line"`;
    echo $SIZE>>"/tmp/DIRS1";
done < "/tmp/DIRS";

如果有人感兴趣,我想要制作一个按大小排序的文件夹列表。这是最终结果。

FOLDER="$1";
for f in $FOLDER/*; do 
  du -sb "$f";
done | sort -n | sed "s#^[0-9]*##" | sed "s#^[^\./]*##" | xargs -L 1 du -sh | sed "s|$FOLDER||";

这会导致执行以下命令:du -sb $FOLDER/* | sort -n | sed "s#^[0-9]*##" | sed "s#^[^\./]*##" | xargs -L 1 du -sh | sed "s|$FOLDER||";


4
它们是目录,不是文件夹。 ;) - Noufal Ibrahim
请查看我在这里的答案,以了解如何通过仅调用一次du而不是*每个文件调用两次来完成此操作。您不需要使用for循环。如果需要,可以在其中添加--max-depth=1du中,并添加您的sed "s|$FOLDER||" - Dennis Williamson
6个回答

42

也许可以使用xargs命令,在每次从stdin接收到额外参数的新行后重新调用指定的命令...

ls -1 $FOLDER | xargs du

但是在这种情况下,为什么不...

du *

应该使用什么符号来表示逻辑或操作?是"||"还是"OR"?

for X in *; do
    du $X
done

就我个人而言,我使用zsh,可以修改glob模式来仅查找普通文件、目录、符号链接等 - 我相信bash中也有类似的功能 - 如果需要详细信息,可以搜索一下。

请问我是否缺少您的任何要求?


最终脚本应该显示按大小排序的文件/文件夹列表,按大小排序。 - Quamis
那么好吧,如果是这样的话,仅使用 du * | sort -n -k1 应该就足够了。不是吗? - Noufal Ibrahim
for f in $(ls -1 $FOLDER); do 看起来能解决问题。现在我需要弄清楚如何制作最终列表 :) - Quamis
1
@Qaumis:for ... $(ls)对于包含空格的文件名会失败,请使用for ... * - Dennis Williamson
@TonyDelroy,您能否请看一下这个案例?https://stackoverflow.com/questions/45482766/script-to-execute-command-to-all-files-in-folder?noredirect=1#comment77926070_45482766 - amelie
显示剩余3条评论

12

find命令可以让你为它找到的每一个项目执行一个命令。如果没有进一步的参数,它将查找当前目录中的所有文件和文件夹,像这样:

$ find -exec du -h {} \;

{}部分是“变量”,用于存放匹配的内容,这里作为du的参数。\; 结束该命令。


3
这是我第一次看到一个解释了find命令完整工作原理的例子,谢谢! - alanaktion

3

使用通配符扩展,Bash可以轻松循环文件,因此解析ls命令的输出是无用的。

du命令的结果存储到变量中再输出到文件也是无用的。

我的建议:

for i in ./tmp/DIRS/*
do
    du "$i" >> "/tmp/DIRS1"
done

3
这样做有什么问题吗?
function process() {
   echo "Processing $1"
}

for i in *
do
  process $i
done

你可以把你要完成的所有“工作”放在process函数内,这将在当前目录中完成。

你能否看一下这个问题? https://stackoverflow.com/questions/45482766/script-to-execute-command-to-all-files-in-folder?noredirect=1#comment77926070_45482766 - amelie

0

这适用于当前目录中的每个文件:

do
   /usr/local/mp3unicode/bin/mp3unicode -s cp1251 --id3v2-encoding unicode "$file"
done

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接