【发布时间】:2017-08-23 18:55:56
【问题描述】:
这里是新的(和编码)。我正在编写一个简单的 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 " " "_",它应该将当前目录中所有文件的名称中的所有空格都更改为下划线。但事实并非如此,我认为这是ls 的错。 for 循环跳过了一些文件,因为ls 每次mv 有效地修改其中一个文件时都会更改文件排序的顺序。所以我需要以一种不依赖于“最后修改”属性的方式来隔离文件的名称。我想到了文件大小,但如果有两个大小相同的文件,这将不起作用——例如,我正在一个充满空文件的目录上尝试此代码。
有没有办法使用ls 对文件进行排序,以使它们保持与mv 修改其名称时相同的顺序?
【问题讨论】: