디렉토리에서 /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
필요한 경우 디렉터리를 복사하도록 위의 내용을 수정할 수 있습니다. 현재는 생략되어 있습니다.