sea side she side

写真と山、資格が好きなアラフォーエンジニアのブログ

フォルダ配下の複数ファイルや複数ディレクトリに対して任意のコマンドを実行

      2012/12/28

ディレクトリ配下の複数ファイルに対してコマンド(例えばchmod)を実行したいとき、素直に

 chmod -R 644 foldername

とかやりたいところですが、ディレクトリ内に子ディレクトリがあると、その子ディレクトリにまでchmod 644がかかってしまいます。

なのでfindでtypeオプションをつかい、regular fileやdirectoryを選別してxargsにパイプで渡してやればフォルダ配下のファイルやフォルダに対して任意のコマンドを実行することができます。

 $ find . -type f -print | xargs chmod 644
 $ find . -type d -print | xargs chmod 755

ところが、これでも困ったことが起こることがあります。ファイル名やディレクトリ名にスペースが入っている場合です。私はファイル名にスペース入れるなんて! って人ですが複数人で使っているとそういう文化の人もいるので仕方ありません。

ということでそんな場合にはfindの-print0オプションとxargsの-0オプションを利用します。

-print0オプションを指定すると区切り文字がスペースからnullに、-0オプションを指定するとnullを区切り文字として扱ってくれるので、

 $ find . -type f -print0 | xargs -0 chmod 644
 $ find . -type d -print0 | xargs -0 chmod 755

とするとスペースを含んだファイル名やディレクトリ名でも思った通りの動作をしてくれます。

【参考】
wikipedia
[ま]技術雑記

2012/12/28 追記
wikipediaにもありますが、imapなんかで古いファイルを削除するときに

 $ rm -rf .Trash/*

なんてやると、対象ファイルが多すぎる場合「引数リストが長すぎます」というエラーメッセージとともにrmコマンドが失敗します。

wikipediaでは

 $ find /path -type f -exec rm '{}' +

などが紹介されていますが、

 $ find ./ -mtime +60 -type f -delete

なんて-deleteオプションも同様のことができる(はず)。ちなみに-time +60は(60+1)x24時間経過したファイルを検索するオプション。

 - IT , ,