在 bash 中,我有一个解压缩的目录,其中有许多以_
.
我很确定我可以使用rename
ormv
来简单地删除_
包含它的每个文件的前缀。
我尝试:
for file; do
mv "$file" "${file//_/}"
done
但这并没有达到我想要的效果。我可以使用什么命令_
从所有文件中删除前缀?
答案1
1)for file; do
循环位置参数,即脚本的命令行参数。用于for file in *; do
循环目录中的文件(或_*
仅获取带有下划线前缀的文件。)
2) 您可以使用${file#_}
而不是${file//_/}
删除文件名开头的下划线。${par#word}
专门从一开始就删除了一部分,这是一个标准功能,与${par/pat/repl}
.当然${file//_}
会删除全部斜杠(因为您使用了双斜杠),而不仅仅是第一个斜杠。
3)至少在Linux(GNU用户区)和FreeBSD上,您可以使用mv -n
它来要求它不要覆盖任何文件。万一。
所以,
for file in _*; do
mv -n -- "$file" "${file#_}"
done
答案2
简单地与prename
(Perl 重命名)命令:
prename -n 's/^_//' _*
答案3
你非常接近:
for file in _*; do
if ! [[ -f "${file/_/}" ]]; then
mv "$file" "${file/_/}"
else
echo "Replacement for '$file' already exists; skipping.." 1>&2
fi
done
为什么${file/_/}
?因为您指定了下划线前缀。于是_file_name.ext
就会变成file_name.ext
。有了${file//_/}
,_file_name.ext
就会成为filename.ext
。
答案4
您可以使用 sed
for file in /some/path/*; do
if [ -f "$file" ]; then
mv "$file" `echo "$file" | sed 's*_**g'`
fi
done