mv는 파일 이름을 필터링하기 위해 grep을 사용하는 파이프의 stdin에 대해 불평합니다.

mv는 파일 이름을 필터링하기 위해 grep을 사용하는 파이프의 stdin에 대해 불평합니다.

공백이 포함된 여러 .avi 파일을 CD에서 홈 폴더로 이동하려고 합니다. 공백을 제거하는 방법을 이미 알고 있습니다.

find /media/mathscd/ | grep -L -r "*.avi" | for file in *; do mv "$file" echo $file | tr ' ' '_' ; done

그런데 편집된 파일을 찾아서 폴더로 함께 옮기는 데 어려움을 겪고 있습니다. 오류 메시지가 계속 나타납니다 mv: cannot stat '(standard input)': No such file or directory. 이것은 내가 사용하려는 코드입니다:

find /media/mathscd/ | grep -L -r  "*.avi" | xargs -I{} mv {} /home/09murphyt/Downloads/

누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있나요?

답변1

문제는 매뉴얼 페이지에서 -L다음으로 전환 됩니다.grep

L, --files-without-match는
일반 출력을 억제합니다. 대신 일반적으로 인쇄되지 않는 각 입력 파일의 이름을 인쇄합니다. 검색은 첫 번째 일치에서 중지됩니다.

그래서 나열하는 대신파일 이름일치하지 않는 항목 avi만 나열됩니다.장소어디에서도 grep찾을 수 없습니다 avi. grep검색은 일반적으로 파일 내에서 이루어지기 때문에 이러한 스위치는 avi패턴이 포함되지 않은 파일 이름을 나열합니다. 그러나 귀하의 경우 grepfrom 으로 파이핑하고 있으므로 find읽고 있는 파일은 grep입니다 (standard input). 무슨 뜻인지 보려면 다음을 시도해 보세요.

find /media/mathscd | grep -L "*.avi"

결과:

(standard input)

즉, grep발견된 행이 "*.avi"표준 입력과 일치하지 않는데, 이것이 바로 발생합니다.

파일 이름이 직접 나열 되므로 find일치 항목의 의미를 반대로 바꾸면 됩니다.

find /media/mathscd | grep -v ".*\.avi"

( grep패턴은 쉘 와일드카드와 동일하지 않습니다. 스위치도 필요하지 않습니다 -r.)

또는 find단독으로 사용:

find /media/mathscd ! -name "*.avi"

답변2

다음 중 하나를 시도해 보십시오.

find /media/mathscd/ -name *.avi -exec mv -t ~/Downloads/ {} +
find /media/mathscd/ -name *.avi -print0 | xargs -0 mv -t ~/Downloads/

xargs mv*먼저 교체하여 테스트 해 보세요 xargs ls.

관련 정보