Bash命令ls排序选项

Bash命令ls排序选项,bash,shell,ls,Bash,Shell,Ls,这里是新的和新的编码。我正在编写一个简单的bash脚本,帮助我将当前目录中所有文件中的一个字符更改为另一个字符。代码如下: #!/bin/bash #this script changes characters in all files of the current directory NUM=$(ls -1 | wc -l | awk '{print $1}') echo "There are $NUM files in this folder." echo "Changing $1 to

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

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

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

echo "There are $NUM files in this folder."
echo "Changing $1 to $2 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/${1}/${2}/g")
    mv -v "$OLDNAME" "$NEWNAME"
done
因此,如果我写./ccin.sh u,它应该将当前目录中所有文件名中的所有空格都更改为下划线。但事实并非如此,我认为这是ls的错。for循环跳过了一些文件,因为每次mv有效地修改其中一个文件时,ls都会更改文件的排序顺序。因此,我需要以一种不依赖于上次修改的属性的方式隔离文件名。我考虑过文件大小,但如果有两个文件大小相同,那么这就行不通了——例如,我正在一个满是空文件的目录中尝试这段代码


是否有一种方法可以使用ls对文件进行排序,以便它们在mv修改名称时保持相同的顺序?

您可以尝试使用以下方法替换for循环:

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

您不需要多次运行ls来重命名文件,而只需运行一次find并迭代结果

谢谢!这要简单得多。是的,但我刚刚意识到它不适用于带空格的文件名,让我来解决它。也许使用awk?不要在$ls中使用任何东西,请参阅@piarston,这应该是bash脚本的练习