ディレクトリとサブディレクトリのすべてのエントリからスペースを削除します。

ディレクトリとサブディレクトリのすべてのエントリからスペースを削除します。

ファイルとサブディレクトリを含むディレクトリがあり、その一部には名前にスペースが含まれています。また、各サブディレクトリには名前にスペースを含むファイルが含まれています。親ディレクトリとすべての子ディレクトリのすべての名前からスペースを一度に削除する簡単な方法はありますか?

答え1

find名前を変更する必要があるファイルを列挙するには、このコマンドを使用します。パフォーマンスを向上させるには、スペースを含むファイル名のみを選択してください。ディレクトリの閲覧中にディレクトリの名前を変更すると、一部のディレクトリが失われる可能性があるため、ディレクトリ-depth自体で作業する前に、サブディレクトリのファイルで機能するオプションを渡します。find

find /path/to/directory -depth -name '* *' -exec … {} +

お持ちの場合prenamePerl 式を適用してファイル名を変更するコマンドです。完全なディレクトリパスではなく、ファイルのデフォルト名に対してのみ作業するように注意する必要があります。findこの場合の-execdir便利な方法は次のとおりです。

find /path/to/directory -name '* *' -execdir prename 's/ //g' {} +

s/ //g代替方法は、s/ /_/gスペースを直接削除するのではなく、下線に置き換えるか、一連s/ +/_/gのスペースを単一の下線に置き換えます。

-execdirPerlコードではディレクトリ回避ロジックは必要ありません。

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' "{}" \;

追加読書

頑張ってください!

関連情報