이 디렉터리 아래의 모든 디렉터리에 있는 모든 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' '{}'" \;