对当前目录中的每个文件执行命令

时间:2010-11-10 09:25:09

标签: linux bash

如何为当前文件夹中的每个文件/文件夹执行某个命令?

我已经开始使用它作为基本脚本了,但这似乎只在使用临时文件时才有效,而且我真的不喜欢这个ideea。还有其他办法吗?

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||";

6 个答案:

答案 0 :(得分:29)

也许是xargs,它会为stdin上收到的每个额外参数行重新调用之后指定的命令...

ls -1 $FOLDER | xargs du

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

du *

...?还是......

for X in *; do
    du $X
done

(就个人而言,我使用zsh,你可以修改glob模式,只能找到说常规文件,或只有目录,只有符号链接等 - 我很确定在bash中有类似的东西 - 如果你需要可以挖掘细节这一点)。

我是否遗漏了您的部分要求?

答案 1 :(得分:9)

find命令将允许您为找到的每个项执行命令。如果没有进一步的参数,它将在当前目录中找到所有文件和文件夹,如下所示:

$ find -exec du -h {} \;

{}部分是放置匹配的“变量”,此处为du的参数。 \;结束命令。

答案 2 :(得分:3)

这样的事情出了什么问题?

function process() {
   echo "Processing $1"
}

for i in *
do
  process $i
done

您可以将所需的所有“工作”放在函数process中。这将为您当前的目录。

答案 3 :(得分:2)

解析ls的输出以循环文件是没用的。 Bash可以通过通配符扩展来实现。

du的结果存储在变量中以将其输出到文件中也是无用的变量。

我建议:

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

可以通过两种方式来调用动作exec:

  • find . -type d -exec du -ch {} \;
  • find . -type d -exec du -ch {} +

在第一个命令中,对找到的每个文件夹进行替换{}。在第二篇文章中,所有find结果立即传递给exec,这很重要,以获得最终总数。

https://www.eovao.com/en/a/bash%20find%20exec%20linux/2/bash-execute-action-on-find-(-exec)-for-each-file