use*_*017 1 unix bash shell sh
我有一个包含文件名的fodler,其中包含空格.
我创建了一个替换空格的脚本,并使用_而不是""(空格)创建新文件名,并在for循环中运行mv命令.
这在脚本中没有用,并给我以下消息.
Usage: mv [-I] [ -d | -e] [-i | -f] [-E{force|ignore|warn}] [--] src target
or: mv [-I] [-d | -e] [-i | -f] [-E{force|ignore|warn}] [--] src1 ... srcN directory
Run Code Online (Sandbox Code Playgroud)
但是如果我调试shell脚本并单独提取mv命令并运行它,它确实可以正常工作而没有任何问题.
生成的命令看起来像
mv "abc ddd eee.txt" abc_ddd_eee.txt
Run Code Online (Sandbox Code Playgroud)
你能否告诉我为什么在unix盒子上输入的命令工作正常而不是通过脚本?
整个脚本:
for i in *
do
v1=$(echo $i|sed -e 's/^/"/g' -e 's/$/"/g' )
v2=$(echo $v1|sed 's/ /_/g'|
awk -F "[-.]" '{print $2,"_",$1,".",$3}'|
sed 's/ //g'|
sed -e 's/^_//g' -e 's/"$//g'|
sed 's/"//2' )
mv $v1 $v2
done
Run Code Online (Sandbox Code Playgroud)
在本机bash中,除了mv自身之外没有其他外部工具:
for i in *; do
# change all spaces to underscores
v2=${i// /_}
# split into pieces on . and _ characters, and reassemble after
IFS='._' read -r first second rest <<<"$v2" && {
v2="${second}_${first}.${rest}"
}
# remove any leading underscore
v2=${v2#_}
# rename
mv -- "$i" "$v2"
done
Run Code Online (Sandbox Code Playgroud)
这是远远大于建立一个新的管道的运行更加高效sed,并awk为处理每个文件名一次.