如何反转 bash 脚本中的 for 循环

mbe*_*ann 1 linux bash loops for-loop

我需要反转 bash 脚本中的 for 循环。有一个目录,其中包含以 %Y%m.mp4 命名的视频(201701.mp4;201702.mp4、201703.mp4,...)。循环应从最旧的文件名开始(例如 201712.mp4) 如何反转我的 for 循环?

outputdir="/path/to/video/monthly/"

for file in "$outputdir"*.mp4
do

echo $file

done
Run Code Online (Sandbox Code Playgroud)

mar*_*ell 6

您可以通过以下方式按保留顺序列出文件:

ls -1 $outputdir/*.mp4 | sort -r
Run Code Online (Sandbox Code Playgroud)

所以在你的脚本中你可以这样做:

outputdir="/path/to/video/monthly/"
for file in $(ls -1 $outputdir*.mp4 | sort -r)
do
   echo $file
done
Run Code Online (Sandbox Code Playgroud)

注意:正如 @PesaThe 指出的那样,此解决方案无法处理带有空格的文件名。如果是你的情况,你应该引用命令:"$(ls -1 $outputdir*.mp4 | sort -r)"并使用"$file"

更新:请参阅以下测试

mkdir test && cd $_
for i in {1..5}; do touch test_$i.txt; done
cd -
Run Code Online (Sandbox Code Playgroud)

ls -1 test/*.txt会输出:

test/test_1.txt
test/test_2.txt
test/test_3.txt
test/test_4.txt
test/test_5.txt
Run Code Online (Sandbox Code Playgroud)

ls -1 test/*txt | sort -r会输出:

test/test_5.txt
test/test_4.txt
test/test_3.txt
test/test_2.txt
test/test_1.txt
Run Code Online (Sandbox Code Playgroud)

  • 注意:`ls -r` 是 ls 反向排序的一种方法。 (3认同)
  • @marcell 这要好得多,但是,不适用于带有换行符的文件名;) (2认同)