如何从目录中的所有文件名中删除“_”

如何从目录中的所有文件名中删除“_”

在 bash 中,我有一个解压缩的目录,其中有许多以_.

我很确定我可以使用renameormv来简单地删除_包含它的每个文件的前缀。

我尝试:

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

相关内容