파일 이름에 공백이 있는 "xargs"

파일 이름에 공백이 있는 "xargs"

나는 노력한다이미지가 아닌 파일만 나열, 가장 최근 500개의 파일만 검색합니다. 그래서 난 달린다

ls -t | head -500 | file | grep -v 'image'

옳지 않습니다. 도움말 메시지가 표시됩니다. 그것을로 바꾸다

ls -t | head -500 | xargs file | grep -v 'image'

이제 원하는 출력이 나올 때도 있지만 파일 이름에 공백(예: 등 )이 포함되어 Plutonian\ Nights\ -\ Sun\ Ra.mp3있으면 xargs실행됩니다 file Plutonian.file Nights


공간을 보는 데 어떻게 도움을 주거나 xargs내가 성취하려는 일을 성취할 수 있나요?

답변1

를 사용하면 xargs다음과 같이 수행할 수 있습니다.

find . -type f -print0 | xargs -0 file | grep -v 'image' 

그런데 xargs그게 어제였어요. 오늘도 멋진 아이들이 사용하고 있어요 parallel. 병렬성을 사용하면 다음과 같습니다.

find . -type f | parallel file | grep -v 'image'

바라보다. -print0 및 -0은 사용되지 않습니다. parallel정말 스마트한 것 그 자체입니다.

고쳐 쓰다

가장 최근 500개 파일만 나열하려면 다음 명령을 사용하세요.

ls -1t | head -500 | parallel file {} | grep -v image

중요한

병렬 프로그램이 오래되어 위 구문이 작동하지 않는 경우 여기에 있는 지침에 따라 병렬 프로그램의 새 버전을 설치하십시오.http://www.gnu.org/software/parallel/parallel_tutorial.html

답변2

"find" 및 "-print0" 옵션을 사용하고 출력을 "xargs" 및 "-0" 옵션으로 파이프합니다.

나는 이 기술을 알고 사용하지만 @Jens 사용자가 비슷한 질문에 답변한 것을 보았습니다. 여기에서 자세한 내용을 확인할 수 있습니다.

https://stackoverflow.com/questions/16758525/use-xargs-with-filenames-포함-whitespaces

답변3

도움이 될만한 대략적인 두 가지 제안이 있습니다. 하지만 어느 쪽도 그다지 만족스럽지 않으므로 어쩌면 더 나은 것이 나올 수도 있습니다.

먼저 sed를 사용하여 모든 항목에 따옴표를 추가하십시오. 따라서 파일 이름에 따옴표가 있는 경우에만 문제가 발생합니다.

ls -t | head -500 | sed -e 's/\(.*\)/"\1"/' | xargs file | grep -v 'image'

또 다른 방법은 ls를 사용하여 가장 최근의 501을 찾은 다음 find를 사용하여 최신 항목을 얻는 것입니다.

find -newer $(ls -t | head -501 | tail -1) -type f -exec file {} \; | grep -v image

답변4

당신은 시도 할 수 있습니다

printf "%s\0" $(ls -t | head -500) | xargs -0 file | grep -v image

이렇게 하면 xargs가 null로 구분된 파일 이름 인수를 사용하게 됩니다.

관련 정보