동일한 파일 확장자가 .txt인 모든 파일을 새 디렉터리로 이동합니다.

동일한 파일 확장자가 .txt인 모든 파일을 새 디렉터리로 이동합니다.

기본적으로 내 하드 드라이브는 기본 디렉토리 내에 200개 이상의 하위 디렉토리가 있어 엉망입니다. .txt200개 이상의 하위 디렉터리에 있는 확장명 등이 있는 모든 파일을 새 디렉터리로 이동하고 싶습니다 . 예를 들어, 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의 출력을 파이프하고 실행하라고 지시하면 됩니다(인수는 기본적으로 끝에 추가됩니다).findxargsxargsmv

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/ \;

관련 정보