저는 Cygwin을 Linux 셸로 사용하고 있으며 현재 작업 디렉터리에 다음이 있습니다.
문서:
Abc.dat
123.dat
456.dat
목차:
W_Abc_w
W_123_w
W_456_w
이제 다음과 같이 파일을 복사하고 싶습니다.
Abc.dat -> W_Abc_w
123.dat -> W_123_w
456.dat -> W_456_w
한 줄의 Linux 명령으로 이를 어떻게 달성할 수 있습니까? 향후 유사한 상황에 사용할 수 있는 일반적인 솔루션이 필요합니다...
대상 디렉터리는 항상 존재하지만 파일 이름의 문자 수는 다양합니다. 대상 디렉토리 이름에는 항상 복사할 파일의 파일 이름과 기타 추가 문자가 포함됩니다. 대상 디렉터리 이름에는 고유한 패턴이 있습니다. Abc_sa_file_name_1 두 번째 디렉터리 이름은 Abc_sa_file_name_2입니다. 파일 이름에도 kim_1과 같은 패턴이 있습니다. 골드_2.
kim_1 파일을 Abc_sa_kim_1_1로 이동하거나 복사하겠습니다. 하나의 명령으로 전체 패턴을 조작하고 싶습니다.
답변1
명령(줄)에서:
cp Abc.dat W_Abc_w/; cp 123.dat W_123_w/; cp 456.dat W_456_w/
후행 슬래시는 필수는 아니지만 파일을 대상에 넣으려는 의도를 나타내는 규칙입니다.목차새롭지 않은문서.
패턴이 있는 일반 루프로:
for f in ???.dat
do
[ -d W_"${f%.dat}"_w ] && cp -- "$f" W_"${f%.dat}"_w
done
그러면 모든 파일 이름 뒤에 3개의 문자가 따라와서 .dat
해당 이름의 디렉터리에 복사됩니다(해당 디렉터리가 이미 존재하는 경우). 명령 내의 파일 이름 확장명은 cp
뒤에 오는 확장명이 제거됩니다 .dat
.
루프를 사용하지 않고 루프를 사용하지 않는 명령줄 접근 방식에 관심이 있는 경우행동대신 파일복사그들 - zsh를 사용할 수 있습니다:
autoload zmv
zmv '(???).dat' 'W_$1_w'