これは私のディレクトリです:
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を見つけたファイルのパスと名前に置き換えます。このセクションでは、すべてのファイル名()で()角括弧()とスペース([])をスペース()に置き換えるコマンドが必要です。これらのコマンドを実行する前に、逆順ソート()()()が重要です。そうしないと、サブフォルダの名前を変更する前に親フォルダの名前を変更でき、コマンドは失敗します。sh
printf
$(echo %f | sed 's/[][ ]//g')
sed
s/
][
//
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番目の名前変更では角かっこが削除されます。