如何重命名特定目录中的所有文件,其中文件名称中包含空格和特殊字符($ 和 @)?
我尝试使用rename
以下命令将所有空格和特殊字符替换为 _:
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report [email protected]
$ rename -n 's/ |\$|@/_/g' *
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report [email protected]
$
该命令可以工作,但不会对文件名进行任何更改,也不会返回任何错误。如何解决这个问题以及还有其他方法吗?
答案1
该-n
旗帜是为了
--不采取行动
无操作:显示哪些文件将被重命名。
所以如果你没有任何改变的话,这是正常的。
关于你的命令,它对我有用:
$ touch "a @ test"
$ ls
a @ test
$ rename -n 's/ |\$|@/_/g' *
a @ test renamed as a___test
也许根据你的 shell,你必须转义 |
$ rename -n 's/ \|\$\|@/_/g' *
或者您可以使用[…]
符号对字符进行分组:
$ rename -n 's/[ @\$]/_/g' *
答案2
你可以这样尝试:
for file in ./*Block*
do echo mv "$file" "${file//[ ()@$]/_}"
done
如果您对结果感到满意,请删除echo
之前的内容mv
以实际重命名文件。
答案3
寻找一个漂亮的脚本来删除特殊字符以及德语特殊字符,将它们替换为通用字符以不删除有用的信息我已经更新了脚本的最后一个版本,该版本存在一些小问题,导致:
#!/bin/bash
for file in ./*
do
infile=`echo "${file:2}"|sed \
-e 's|"\"|"\\"|g' \
-e 's| |\ |g' -e 's|!|\!|g' \
-e 's|@|\@|g' -e 's|*|\*|g' \
-e 's|&|\&|g' -e 's|]|\]|g' \
-e 's|}|\}|g' -e 's|"|\"|g' \
-e 's|,|\,|g' -e 's|?|\?|g' \
-e 's|=|\=|g' `
outfileNOSPECIALS=`echo "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g'`
outfileNOoe=`echo $outfileNOSPECIALS| sed -e 's|ö|oe|g'`
outfileNOae=`echo $outfileNOoe| sed -e 's|ä|ae|g'`
outfileNOue=`echo $outfileNOae| sed -e 's|ü|ue|g'`
outfileNOOE=`echo $outfileNOue| sed -e 's|Ö|OE|g'`
outfileNOAE=`echo $outfileNOOE| sed -e 's|Ä|AE|g'`
outfileNOUE=`echo $outfileNOAE| sed -e 's|Ü|UE|g'`
outfileNOss=`echo $outfileNOUE| sed -e 's|ß|ss|g'`
outfile=${outfileNOss}
if [ "$infile" != "${outfile}" ]
then
echo "filename changed for " $infile " in " $outfile
mv "$infile" ${outfile}
fi
done
exit
导致:
@don_crissti:他正在对 infile 进行 hokus-pokus,因为 Linux 在移动文件名时处理特殊字符时会遇到自己的问题。
答案4
由于该rename
命令由于未知原因对我不起作用,并且我没有得到我的问题的任何其他答案,因此我自己尝试努力使重命名成为可能。这可能不是重命名文件的最佳方法,但它对我有用,这就是为什么我想将其作为答案发布,以便其他人阅读此内容可能会得到一些帮助,以按照我的方式更改文件名。
现在对我来说,我知道所有文件的名称中都会有一个特定的文本,即“块”一词。以下是重命名之前的文件名:
anks@anks:~/anks$ ls -lrt
total 4
-rw-r--r-- 1 anks anks 0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks 0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks 0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks 0 Jul 25 14:47 Bharti TRX Block [email protected]
-rw-r--r-- 1 anks anks 0 Jul 25 14:48 Bharti TRX Block [email protected]
现在我编写了一个小的 shell 脚本来实现这一点。以下是代码:
#!/bin/bash
PATH="/home/ebfijjk/anks"
# Put the old filenames in a file.
ls $PATH | grep Block >> oldValues
# Put the new names without " " or "@" or "$" in another file
cat oldValues | sed 's/\$/_/g' | sed 's/\@/_/g' | sed 's/ /_/g' >> newValues
# Create a new file with Old names and New names seperated by a #.
paste -d'#' oldValues newValues >> oldAndNew
# Read the file with both old and new names and rename them with the new names.
while IFS='#'; read oldValue newValue
do
mv "$oldValue" "$newValue"
done < oldAndNew
rm oldValues newValues oldandNew
就是这样,当我运行脚本时,它会重命名所有包含空格 ( ) 或
$
或@
的文件名_
,而不是这些字符。