ディレクトリ内のすべてのファイル名から「_」を削除する方法

ディレクトリ内のすべてのファイル名から「_」を削除する方法

Bashに_

私はそれを含むすべてのファイルでプレフィックスを使用するか、rename単にmv削除できると確信しています。_

私は試みる:

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 Userland)と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

関連情報