この下のすべてのディレクトリにあるすべてのWord文書の最終更新日を取得しようとしています
$ pwd
/run/user/1000/gvfs/smb-share:server=myServer,share=myResources
私が定期的に見つけると、それは私が期待するものを正確に返します。
$ find . -name "*.do*"
> ./AnsettGoldenWing/Project Sheets/Ansett Golden Wing Text.doc
> ./B000114/Text/060913__B000114.doc
> ./B000170/B000170_projectdetails.doc
> ./B000208/Text Files/archive/060913__B000208.doc
しかし、結果をフォーマットする-exec
を追加すると、すべてがポットになります。
$ find . -name "*.do*" -exec sh -c "stat --printf='%n --- %y \n' {}" \; > fileInfo.txt
> stat: cannot stat ‘./AnsettGoldenWing/Project’: No such file or directory
> stat: cannot stat ‘Sheets/Ansett’: No such file or directory
> stat: cannot stat ‘Golden’: No such file or directory
> stat: cannot stat ‘Wing’: No such file or directory
> stat: cannot stat ‘Text.doc’: No such file or directory
> stat: cannot stat ‘./B000208/Text’: No such file or directory
> sh: 1: Spa: not found
> stat: cannot stat ‘./B000503/Submission/Hyatt’: No such file or directory
出力するにはどうすればよいですか?
> ./AnsettGoldenWing/Project Sheets/Ansett Golden Wing Text.doc --- date
> ./B000114/Text/060913__B000114.doc --- date
> ./B000170/B000170_projectdetails.doc --- date
> ./B000208/Text Files/archive/060913__B000208.doc --- date
私はコマンドラインにかなり慣れていません。-exec
とfind
を使用したのはこれが初めてなので、それでも私には黒魔術のように感じます。
問題は、ファイル名の空白です。新しいシェルはそれをリテラルとして扱い、分離されたファイルとして解釈しません。
xargs
コマンドで-print0
オプションを使用できます。
find . -name "*.do*" -print0 | xargs -0 stat --printf='%n --- %y \n'
または、-exec
の代わりに+
を指定して\;
コマンドを使用します。
find . -name "*.do*" -exec stat --printf='%n --- %y \n' {} +
結果(この場合はファイル名)が新しいシェルによって安全に解釈されることを保証できないため、通常、新しいシェルを呼び出すことは避けてください。
空白を保護するために引用する必要があります:
find . -name "*.do*" -exec sh -c "stat --printf='%n --- %y \n' '{}'" \;