
공백이 있는 여러 .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
. 그러나 귀하의 경우 grep
from 으로 파이핑 중이므로 읽고 있는 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
.