如何为当前文件夹中的每个文件/文件夹执行某个命令?
我已经开始使用它作为基本脚本了,但这似乎只在使用临时文件时才有效,而且我真的不喜欢这个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||";
答案 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,这很重要,以获得最终总数。