ファイルとサブディレクトリを含むディレクトリがあり、その一部には名前にスペースが含まれています。また、各サブディレクトリには名前にスペースを含むファイルが含まれています。親ディレクトリとすべての子ディレクトリのすべての名前からスペースを一度に削除する簡単な方法はありますか?
答え1
find
名前を変更する必要があるファイルを列挙するには、このコマンドを使用します。パフォーマンスを向上させるには、スペースを含むファイル名のみを選択してください。ディレクトリの閲覧中にディレクトリの名前を変更すると、一部のディレクトリが失われる可能性があるため、ディレクトリ-depth
自体で作業する前に、サブディレクトリのファイルで機能するオプションを渡します。find
find /path/to/directory -depth -name '* *' -exec … {} +
お持ちの場合prename
Perl 式を適用してファイル名を変更するコマンドです。完全なディレクトリパスではなく、ファイルのデフォルト名に対してのみ作業するように注意する必要があります。find
この場合の-execdir
便利な方法は次のとおりです。
find /path/to/directory -name '* *' -execdir prename 's/ //g' {} +
s/ //g
代替方法は、s/ /_/g
スペースを直接削除するのではなく、下線に置き換えるか、一連s/ +/_/g
のスペースを単一の下線に置き換えます。
-execdir
Perlコードではディレクトリ回避ロジックは必要ありません。
find /path/to/directory -depth -name '* *' -exec prename '
s:.*/::; $dir=$&;
s/ //g;
$_="$dir$_"
' {} +
そうでない場合は、prename
シェルスクリプトを使用してこれを実行できます。シェルから呼び出す必要がありますfind
。 kshがある場合は、${file// /}
コンストラクタを使用して空白が削除された変数の値を取得できますfile
(${file// /_}
各スペースをアンダースコアで置き換えます)。
find /path/to/directory -depth -name '* *' -execdir ksh -c '
mv "$0" "${0// /}"
' {} \;
または
find /path/to/directory -depth -name '* *' -exec ksh -c '
for file do
dir=${file%/*};
file=${x##*/};
mv "$dir/$file" "$dir/${file// /}";
done
' _ {} +
bashまたはmkshがある場合は、kshの代わりにそれを使用できます。それ以外の場合は、sed
文字列処理に使用できます。
find /path/to/directory -depth -name '* *' -exec sh -c '
for file do
dir=${file%/*};
file=${x##*/};
without_spaces=$(printf %s "$file." | sed "s/ //g")
mv "$dir/$file" "$dir/${without_spaces%.}";
done
' _ {} +
答え2
親ディレクトリとすべての子ディレクトリのすべての名前からスペースを一度に削除する簡単な方法はありますか?
ここで:
find /tmp/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
頑張ってください!