Bash 命令 ls 排序选项

Bash command ls ordering options

这里是新的(和编码)。我正在编写一个简单的 bash 脚本,它可以帮助我将当前目录的所有文件中的一个字符更改为另一个字符。这是代码:

#!/bin/bash
#this script changes characters in all files of the current directory

NUM=$(ls -1 | wc -l | awk '{print }')

echo "There are $NUM files in this folder."
echo "Changing  to  in all their names..."
echo "Done! Here's what happened:"

for i in $(seq 1 $NUM)
do
    OLDNAME=$(ls -1 | head -$i | tail -1)
    NEWNAME=$(ls -1 | head -$i | tail -1 | sed -e "s///g")
    mv -v "$OLDNAME" "$NEWNAME"
done

所以如果我写 ./ccin.sh " " "_" 它应该将当前目录中所有文件名中的所有空格更改为下划线。但事实并非如此,我认为这是 ls 的错。 for 循环跳过了一些文件,因为 ls 每次 mv 有效修改其中一个文件时都会更改文件排序的顺序。所以我需要以不依赖于 "last modified" 属性 的方式隔离文件名。我想到了文件大小,但如果有两个大小相同的文件,那将不起作用——例如,我正在一个充满空文件的目录上尝试这段代码。

有没有办法用 ls 对文件进行排序,使它们保持与 mv 修改文件名相同的顺序?

您可以尝试用这个替换您的 for 循环:

find . -type f | while read file
do
    OLDNAME="$file"
    NEWNAME=`echo $file| sed -e "s///g"`
    mv -v "$OLDNAME" "$NEWNAME"
done

您 运行 只查找一次并遍历结果,而不是 运行 多次 ls 来重命名文件