Zsh脚本对目录中按大小排序的文件执行命令

时间:2014-07-17 05:25:06

标签: bash

我必须在一个目录中的所有文件上运行一些命令,这些文件从最小的文件开始到最大的文件。该脚本使用' 命令及其排序功能正常运行,但提到的某些帖子是为了避免使用' ls'如果有带空格的文件名。请指导我有关此方法的替代方法吗?

由于

for file in `ls -Sr directory/*.txt`; do
....commands....
done

5 个答案:

答案 0 :(得分:3)

逐行阅读您的输出并使用-1

while IFS= read -r file; do
    ...
done < <(exec ls -1 -Sr directory/*.txt)

另:

readarray -t files < <(exec ls -1 -Sr directory/*.txt)
for file in "${files[@]}"; do
    ...
done

也就是说,如果您真的使用bash

对于Zsh:`

while IFS= read -u 4 -r file; do
    echo "$file"
done 4< =(exec ls -1 -Sr directory/*.txt)

答案 1 :(得分:0)

使用查找将是更好的选择。将find命令的输出分配给一个数组并按如下方式遍历数组。(如果文件名中有空格,这将处理)

 OLDIFS=$IFS
 IFS=$'\n'
 files=$(find directory -type f -name \*.txt -exec du {} \; |sort -n | cut -d$'\t' -f2-);
 for file in ${files}; do
  ....commands....
 done
 IFS=$OLDIFS

如果您想以非递归方式搜索 -maxdepth 1

 OLDIFS=$IFS
 IFS=$'\n'
 files=$(find directory -type f -maxdepth 1 -name \*.txt -exec du {} \; |sort -n | cut -d$'\t' -f2-);
 for file in ${files}; do
  ....commands....
 done
 IFS=$OLDIFS

答案 2 :(得分:0)

试试这个: -

for file in `find directory/ -iname "*.txt" -type f  | xargs du | sort -n | awk '{print $2}'`; do
    ....commands....
done

答案 3 :(得分:0)

只要您引用所有内容,我就不会想到迭代具有空格的文件名的ls -Sr输出的问题。

使用命令替换时,无论何时在循环中引用变量"$file",都应该使用双引号。

for file in "$(ls -Sr directory/*.txt)"; do
    ....commands....
done

但是如果你想避免ls,你可以这样做:

while read -r _ file; do
    ....commands....
done < <(du directory/*.txt|sort -n)

答案 4 :(得分:0)

sh$ xargs -d '\n' -L1 echo < <(ls -Sr directory/*.txt)
directory/a.txt
directory/a b.txt

当然,请用实际命令替换echo