특정 길이의 파일 이름을 가진 모든 파일 복사

특정 길이의 파일 이름을 가진 모든 파일 복사

디렉토리에서 /source파일 이름이 15자보다 긴 모든 파일을 디렉토리에 복사하고 싶습니다 /dest. 이를 수행하는 UNIX 명령이 있습니까?

편집하다: 하지만이 문제특정 길이의 파일 이름을 검색하는 방법에 대해 설명했고, 파일을 복사하는 방법도 질문했습니다.

답변1

내가 아는 한, 이 작업을 수행하기 위한 특별한 명령은 없지만 쉘 글로브 모드를 활용할 수 있습니다.

cp /source/????????????????* /dest

가지다16별표 앞에 물음표("15자 이상"을 원한다고 명시합니다. 이는 "최소 16자"를 의미함).

내 현재 답변에 대한 참고 사항은 다음과 같습니다.

  • 셸 구성에 따라 "숨겨진" 파일(예: .점( )으로 시작하는 파일)은 복사되지 않을 수 있습니다.
  • 직접 하위 디렉토리는 복사되지 않습니다 /source. 각 파일 이름이 15자를 초과하는 디렉터리에 대해서만 경고를 표시합니다. 모든 것을 재귀적으로 복사 /source하고 계층 구조를 유지하려는 경우 이 대답은 더 복잡합니다.

답변2

16자 이상의 문자를 포함하는 패턴을 생성하고 해당 파일을 복사할 수 있습니다.

16개의 문자를 사용하는 간단하지만 우아하지 않은 방법은 ?각 문자가 단일 문자와 일치합니다.

for n in /source/????????????????*;do [ -f "$n" ] && cp "$n" /dest/; done

16번째 이후에는 ?임의 *개수의 문자와 일치합니다. 패턴이 실제로 어떤 것과도 일치하지 않을 수 있으므로 여전히 -f파일인지 확인하기 위해 테스트해야 합니다.

답변3

?????????????????????솔루션은 당신이 나처럼 8까지 셀 수 없는 사람이 아니라면 훌륭합니다. 이 경우 다음을 사용할 수 있습니다 find.

find . -maxdepth 1 -regextype posix-egrep -regex '.{17,}' -exec cp -t /dest {} +
  • 를 사용할 때는 이전 내용을 17고려해야 합니다 ./.
  • -regextype posix-egrep중괄호 모드를 허용해야 합니다 {}. 기본 정규식 유형 find은 다음과 같습니다.이맥스이것은 이것을 허용하지 않습니다.
  • cp모든 출력이 소스 -t로 처리되도록 대상을 첫 번째 인수(옵션)로 배치해야 합니다 .{} +

답변4

GNU 및 Gawk가 포함된 Linux 시스템을 언급하는 경우 다음이 해결책입니다. 소스는 이며 , 파일 이름에 공백이 없다고 가정하고 7자보다 긴 파일 이름 /home/my_folder으로 복사됩니다 ./dest

ls /home/my_folder/ |awk '{if(length($0)>7){print "cp /home/my_folder/"$0" /dest/"$0";";}}'

어떤 출력:

cp /home/my_folder/orbit-antixcat /dest/orbit-antixcat;
cp /home/my_folder/spacefm-antixcat-569be3dc.tmp /dest/spacefm-antixcat-569be3dc.tmp;
cp /home/my_folder/xsession-modified-date /dest/xsession-modified-date;

문제가 없으면 셸을 통해 파이프하여 실제로 파일을 복사합니다.

ls /home/my_folder/ |awk '{if(length($0)>7){print "cp /home/my_folder/"$0" /dest/"$0";";}}'|bash

이름에 공백이 있는 파일을 수용하기 위해 몇 가지 따옴표를 추가할 수 있습니다.

ls /home/my_folder |awk '{if(length($0)>7){print "cp \047/home/my_folder/"$0"\047 \047/dest/"$0"\047;";}}'|bash

인용된 출력의 예:

cp '/home/my_folder/kdecache-antixcat' '/dest/kdecache-antixcat';
cp '/home/my_folder/ksocket-antixcat' '/dest/ksocket-antixcat';

별칭이 있는 경우 cp 바이너리를 지정할 수 있습니다. 아마도 원하지 않는 덮어쓰기에 대한 확인이 있을 것입니다.

ls /home/my_folder |awk '{if(length($0)>2){print "/bin/cp \047/home/my_folder/"$0"\047 \047/dest/"$0"\047;";}}'|bash

필요한 경우 디렉터리를 복사하도록 위의 내용을 수정할 수 있습니다. 현재는 생략되어 있습니다.

관련 정보