【问题标题】:Execute command for every file in the current dir对当前目录中的每个文件执行命令
【发布时间】:2010-11-10 09:25:09
【问题描述】:

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

我已经开始将此作为基本脚本,但这似乎仅在使用临时文件时才有效,我不太喜欢这个想法。有没有其他办法?

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

【问题讨论】:

  • 它们是目录。不是文件夹。 ;)
  • 查看我的回答 here 以了解一种方法,只需调用一次 du 而不是每个文件两次。您不需要for 循环。如果需要,您可以将--max-depth=1 添加到其中的du,并且您可以添加您的sed "s|$FOLDER||"。

标签: linux bash


【解决方案1】:

也许是 xargs,它为 stdin 上收到的每一行附加参数重新调用它之后指定的命令...

ls -1 $FOLDER | xargs du

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

du *

...?或者……

for X in *; do
    du $X
done

(就个人而言,我使用 zsh,您可以在其中修改 glob 模式以仅查找常规文件,或仅目录,仅符号链接等 - 我很确定 bash 中有类似的东西 - 如果需要,可以挖掘详细信息那个)。

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

【讨论】:

  • 最终的脚本应该显示一个按大小排序的文件/文件夹列表,按大小排序
  • 嗯,在这种情况下,仅du * | sort -n -k1 就足够了。没有?
  • 然后你可以使用管道 du -b * | sort -n,其中 -b 指定字节:将其更改为 -k 表示千字节等,但你需要使用相同的单位才能进行比较和排序(请参阅man du用于选项),并且 sort -n 对第一个字段的数值进行排序(而不是 ASCII 文本比较,其中“2”将在“10”之后)。
  • for f in $(ls -1 $FOLDER); do 似乎可以解决问题。现在我需要弄清楚如何制作最终名单:)
  • @Qaumis: for ... $(ls) 对于包含空格的文件名失败。使用for ... *
【解决方案2】:

find 命令也可以让您对其找到的每个项目执行一个命令。如果没有进一步的参数,它将查找当前目录中的所有文件和文件夹,如下所示:

$ find -exec du -h {} \;

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

【讨论】:

  • 这是我第一次看到find 的示例,它实际上解释了给出的完整命令实际上是如何工作的。谢谢!
【解决方案3】:

解析ls 的输出以循环文件是没有用的。 Bash 可以通过通配符扩展来做到这一点。

将du的结果存储在一个变量中输出到一个文件中,也是对变量的无用使用。

我的建议:

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

【讨论】:

    【解决方案4】:

    这样的事情有什么问题?

    function process() {
       echo "Processing $1"
    }
    
    for i in *
    do
      process $i
    done
    

    您可以将所有想要完成的“工作”放在函数process 中。这将为您的当前目录执行此操作。

    【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      action 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

      【讨论】:

        猜你喜欢
        • 2010-11-30
        • 2013-10-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        相关资源
        最近更新 更多