다음과 같은 이름을 가진 파일이 있습니다.
XXXXX_S1_X_XX_X.txt
XXXXX_S2_X_XX_X.txt
XXXXX_S3_X_XX_XXX.txt
S4_X_XX_X.txt
XXXXX_S5_XX_X.txt
...
S1
, S2
, , ... 라는 S3
폴더 목록을 만들었습니다 . XXXXX_S1_X_XX_X.txt
폴더 내 파일, S1
폴더 내 파일 등 을 이동하고 싶습니다 . 이 간단한 루프를 작성했지만 해당 폴더에서 S*와 일치하는 패턴을 기반으로 파일을 복사/이동하는 방법을 모르겠습니다.XXXXX_S2_X_XX_X.txt
S2
for i in My_list_of_folders.txt
do
dir=${i%.txt}
mkdir "$dir"
cp "$i" "$dir"
done
답변1
약간 수정된 루프:
for pattern in S1 S2 S3 S4; do
mkdir -p ./"$pattern"
for filename in ./*"$pattern"*; do
[ ! -f "$filename" ] && continue
mv -i "$filename" "$pattern"/
done
done
S1
그러면 패턴 문자열 및 가 반복됩니다 S2
. 내부 루프는 현재 패턴 문자열을 사용하여 현재 디렉터리에서 해당 문자열을 포함하는 이름을 찾습니다. 비정규 파일(예: 디렉터리 자체 등)을 건너뛰고 일치하는 다른 모든 콘텐츠를 해당 패턴 문자열에 적합한 디렉터리로 이동합니다.S3
S4
S1
S2
slm이 주석(현재 삭제됨)에서 지적했듯이 이 경우 내부 루프의 작업은 다음과 같이 단축될 수 있습니다.
[ ! -f "$filename" ] || mv -i "$filename" "$pattern"/
또는
[ -f "$filename" ] && mv -i "$filename" "$pattern"/
S1
와 같은 패턴이 겹치는 경우 S11
먼저 긴 패턴을 만들어야 합니다.
답변2
대안으로:
for i in S{4..1};do
mkdir -p $i
while read line; do
[ -f "$line" ] && mv "$line" $i
done < My_list_of_folders.txt
done
작동 방식:
S{4..1}
- 쉘 확장을 사용하여 디렉토리 이름 구성mkdir -p $i
- 강제 디렉토리 생성while read ... < My_list_of_folders.txt
- 파일의 줄을 반복합니다.[ -f "$line" ]...
- 각 파일을 해당 S 디렉터리로 이동합니다.
노트:사용 사례에 적합한 범위로 glob({4..1})을 조정할 수 있습니다. 더 큰 작업을 처리하기 위해 S20....S1과 겹치는 부분을 처리하기 위해 역순으로 정렬하므로 S{20..1}
glob에서 정의한 유형입니다.