현재 디렉토리에서 다른 디렉토리로 파일을 이동하려고 합니다. 내가 겪고 있는 문제는 여러 파일에 space, ü, &, (, ...
. 다음과 같은 명령을 사용하여 모든 파일을 어떻게 이동할 수 있습니까? ls | grep mp4 | xargs -i mv {} mp4
여기서 {}
는 현재 파일의 이름이고 mp4는 내 모든 파일을 저장할 대상입니다. 명령을 시도했지만 오류가 표시됩니다. 도와주실 수 있나요?
답변1
바로 이 상황이다당신은 사용하고 싶지 않아ls
in. 또는 xargs
기본 설정을 사용하면 입력을 공백으로 분할하고 따옴표와 백슬래시를 특별히 처리합니다. 해당 동작을 끄려면 -0
null 바이트에서 입력을 분리하거나 줄바꿈(GNU xargs)에서 분리하는 데 사용해야 합니다 .-d'\n'
모든 파일이 동일한 디렉토리에 있으므로 쉘을 사용할 수 있습니다.
mv *mp4* mp4/
또는 확장자가 mv *.mp4 mp4/
있는 파일만 의미한 경우입니다 . mp4
첫 번째는 mp4
자신을 로 이동하는 것에 대해 경고합니다 mp4
.)
zsh
파일이 동일한 디렉터리에 없으면 이중 별표( - 기본적으로 활성화되거나 또는 와 ksh
함께 활성화 됨 ) 를 사용해야 합니다 .set -o globstar
bash
shopt -s globstar
mv **/*mp4* mp4/
또는find
find . -type f -name "*mp*" -exec mv {} mp4/ \;
답변2
명령:
ls | grep mp4 | xargs -i mv {} mp4
대부분의 경우 더 간단하고 강력한 것으로 대체될 수 있습니다.
mv *mp4* mp4
mp4 디렉터리 내부에서 이동할 수 없다는 경고는 무시할 수 있습니다.
귀하의 스크립트와 마찬가지로 이 스크립트는 mp4
이름에 " "가 나타나는 모든 파일을 이동합니다(예: mp4list.txt
, lamp4.jpg
). 실제로 확장자가 " "인 파일만 이동하려면 .mp4
다음을 사용할 수 있습니다.
mv *.mp4 mp4
그러면 디렉터리 mp4
자체에 대한 오류 메시지가 발생하는 상황이 방지됩니다.
mp4 파일 수가 많아 이전 명령이 작동하지 않는 경우 GNU를 사용하여 find
동일한 결과를 얻을 수 있습니다.
find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +
또는
find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +