mv는 grep으로 파일 이름을 필터링하는 파이프라인의 표준 입력에 대해 불평합니다.

mv는 grep으로 파일 이름을 필터링하는 파이프라인의 표준 입력에 대해 불평합니다.

공백이 있는 여러 .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

문제 -Lgrep. 매뉴얼 페이지에서:

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.

관련 정보