我必须在一个目录中的所有文件上运行一些命令,这些文件从最小的文件开始到最大的文件。该脚本使用' 命令及其排序功能正常运行,但提到的某些帖子是为了避免使用' ls'如果有带空格的文件名。请指导我有关此方法的替代方法吗?
由于
for file in `ls -Sr directory/*.txt`; do
....commands....
done
答案 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
。