ファイルの最後の編集日を探す(奇妙な実行動作)

ファイルの最後の編集日を探す(奇妙な実行動作)

このディレクトリの下のすべてのディレクトリにあるすべての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私は初めてコマンドラインに触れ、anとaを初めて使用したfindので、まだ黒魔術のように感じます。

答え1

問題はファイル名の空白です。新しいシェルはそれをリテラルとして扱うのではなく、別々のファイルとして解釈します。

次のコマンド-print0でオプションを使用できます。xargs

find . -name "*.do*" -print0 | xargs -0 stat --printf='%n --- %y \n'

または代わりに-execコマンドを使用してください。+\;

find . -name "*.do*" -exec stat --printf='%n --- %y \n' {} +

通常、結果(この場合はファイル名)が新しいシェルで安全に解釈されることを保証できないため、新しいシェルを呼び出さないでください。

答え2

スペースを保護するには引用符が必要です。

find . -name "*.do*" -exec sh -c "stat --printf='%n --- %y \n' '{}'" \;

関連情報