기본적으로 내 하드 드라이브는 기본 디렉토리 내에 200개 이상의 하위 디렉토리가 있어 엉망입니다. .txt
200개 이상의 하위 디렉터리에 있는 확장명 등이 있는 모든 파일을 새 디렉터리로 이동하고 싶습니다 . 예를 들어, n00b.txt
또는n00b.txt.exe
그래서 200개 이상의 하위 디렉터리가 포함된 홈 디렉터리에서 다음 명령을 시도했습니다.sudo mv **/*.txt ~/Desktop/tmpremo/
대신 다음 오류가 발생합니다.bash: /usr/bin/sudo: Argument list too long
이 메시지가 나타나는 이유는 무엇이며 say 를 제거하려면 어떻게 해야 합니까 .txt,.txt.exe
? 어떻게 해결할 수 있나요?
답변1
이렇게 하면 현재 디렉터리(하위 디렉터리 포함) 내 어디에나 존재하는 확장자를 가진 모든 파일이 .txt
..txt.exe
~/Desktop/tmpremo
$ sudo find . -type f \( -iname '*.txt' -o -iname '*.txt.exe' \) -exec mv {} ~/Desktop/tmpremo \;
다른 확장도 원할 경우 -o -iname '*.extension'
에 추가하면 됩니다 -exec
.
sudo
추신: @xenoid가 지적했듯이 현재 작업에서 절대적으로 필요한 경우가 아니면 사용하지 마십시오.
답변2
(여기 초보자이므로 @BarBar1234의 답변에 대해 언급할 수 없습니다)
나는 명령 자체가 이미 발견된 파일 이름을 에코하므로 "find"의 출력을 에코할 필요가 없다고 생각합니다.
따라서 다음을 사용할 수 있습니다.
sudo find . -type f -iname '*.txt'
그러나 지식을 위해 find: ‘echo ./rdggt_169/frretcdd_td.txt ’: No such file or directory
명령에서 ( ) 결과가 발생합니다.
sudo find . -type f -iname '*.txt' -exec 'echo {}' \;
말하는 부분은 -exec 'echo {}'
작은따옴표 인수를 제공하는 -exec
것이므로 확장된 문자열 전체를 명령으로 처리합니다.
명확하게 말하면 'echo foo/bar.txt' 문자열은 echo
'foo/bar.txt' 인수가 있는 명령이 아닙니다. 따라서 command 라는 시스템에 존재하지 않기 때문에 시스템에서 아무 것도 찾을 수 없습니다 echo foo/bar.txt
.
이것이 바로 BarBar1234가 작은따옴표를 제거하기 위해 답변을 편집한 이유입니다. Now는 echo
이 경우 처리해야 할 내용으로 문자열이 아닌 명령으로 처리됩니다.
답변3
**/*.txt
일치하는 모든 파일(전체 경로 포함)이 매우 긴 명령줄로 확장되고 인수 길이에 제한이 있기 때문에 오류가 발생합니다 .
이것을 사용할 때의 한 가지 문제점은 find ... -exec mv
파일당 한 번 실행된다는 것입니다.mv
허용되는 최대 인수 수를 사용하여 명령을 실행하려고 시도하는 명령이 있으므로 xargs
의 출력을 파이프하고 실행하라고 지시하면 됩니다(인수는 기본적으로 끝에 추가됩니다).find
xargs
xargs
mv
find . -type f -name '*.txt' -print0 | xargs -0 mv -t ~/Desktop/tmpremo
sudo
추신: 자신의 사용자 디렉토리에서 파일 이동을 사용해야 한다는 사실에 놀랐습니다 .
답변4
이것을 시도해보세요최상위 디렉토리하위 디렉터리의 위치:
sudo find . -type f -iname '*.txt' -exec echo {} \;
발견된 파일 목록에 문제가 있는 텍스트 파일 목록이 표시되면 다음을 수행하십시오.
sudo find . -path ~/Desktop/tmpremo -prune -o -type f -iname '*.txt' -exec mv {} ~/Desktop/tmpremo/ \;