複数のディレクトリの名前を変更するには?

複数のディレクトリの名前を変更するには?

これは私のディレクトリです:

P [001]
P [002]
P [003]

名前を次に変更したいです。

P001
P002
P003

私はコードを使用しました:

for P in *\ *; do mv '$P' '${P// /_}'; done

でも何か抜けました。

答え1

努力するprename

$ ls
P [001]  P [002]  P [003]
$ prename 's/[ \[\]]//g' P\ *
$ ls
P001  P002  P003
$

'または、元のスクリプトアプローチに固執してください(正規表現を少し変更してわずかに"変更します)。

$ ls
P [001]  P [002]  P [003]
$ for P in *\ *; do mv "$P" "${P//[\[\] ]/}" ; done
$ ls
P001  P002  P003
$

答え2

ディレクトリが互いに内部にある場合、つまりこれを再帰的に実行すると、上記の答えのどれも機能しません(おそらく動作するかどうかはわかりませんprename)。たとえば、

P [1]
   |___P [10]
   |___P [11]
         |___P [112]
         |___other
               |___P [113]
P [21]
P [132]

パッケージをインストールしなくても使用できます。

find . -type d -name 'P [*' -printf "echo mv \'%h/%f\' \'%h/\$(echo %f | sed \"s/[][ ]//g\")\'\n" | sort -r | sh

テストと実際のタスクの実行:

find . -type d -name 'P [*' -printf "mv \'%h/%f\' \'%h/\$(echo %f | sed "s/[][ ]//g\")\'" | sort -r | sh

説明:現在のフォルダ(find .)を見つけ、-type d名前が()と一致するすべてのディレクトリ()を見つけて、実行に渡されるコマンドを印刷します- name 'P [*'。 %hと%fを見つけたファイルのパスと名前に置き換えます。このセクションでは、すべてのファイル名()で()角括弧()とスペース([])をスペース()に置き換えるコマンドが必要です。これらのコマンドを実行する前に、逆順ソート()()()が重要です。そうしないと、サブフォルダの名前を変更する前に親フォルダの名前を変更でき、コマンドは失敗します。shprintf$(echo %f | sed 's/[][ ]//g')seds/][//g| sort -r| sh

役に立つことを願っています。

編集:@AdminBeeのおかげで、名前の空白の問題が修正されました。

答え3

スペースを削除するには、次のようになりますが(実際にはアンダースコアで置き換えます)、一重引用符の代わりに二重引用符を使用して変数の拡張を防ぐことができます。

Pまた、変数がディレクトリであるかファイルであるかを確認するものではないため、ファイル名を変更することもできることに注意してください。

for P in *\ *;
do
    [ -d "$P" ] && mv "$P" "${P// /_}" || echo 'skipping, the'"$P"' is not a directory'
done

次の手順ですべてのスペース/括弧を削除することもできます。

find -maxdepth 1 -type d -name 'P*' -exec bash -c 'echo ${1} ${1//[][ ]}' bash {} \;
./P [001] ./P001
./P [002] ./P002
./P [003] ./P003

答え4

まず二重引用符を使用する必要があります。$P

単一のコマンドではありませんが、次の作業を実行する必要があります。

for P in *\ *; do rename "s/ //g" * && rename "s/[][]//g" *; done

最初の名前変更では空白が削除され、2番目の名前変更では角かっこが削除されます。

関連情報