이름별로 파일을 그룹화하고 awk를 사용하여 각 디렉터리로 이동합니다.

이름별로 파일을 그룹화하고 awk를 사용하여 각 디렉터리로 이동합니다.

나는 이름(_ 앞의 처음 몇 글자)을 기준으로 파일을 그룹화하고 awk를 사용하여 파일을 별도의 디렉터리로 이동하려고 합니다(없는 경우 새 디렉터리 만들기).

테스트 데이터는 다음 명령을 사용하여 생성할 수 있습니다.

echo "1" > 123_20190911_110011.txt
echo "2" > 123_20190911_110012.txt
echo "0" > 123_20190910_110010.txt
echo "1" > 1234_20190911_110011.txt
echo "2" > 1234_20190911_110012.txt
echo "0" > 1234_20190910_110010.txt

ls -ltr의 출력은 다음과 같습니다.

-rw-r--r-- 1 vipin vipin 2 Sep 11 23:17 123_20190911_110011.txt
-rw-r--r-- 1 vipin vipin 2 Sep 11 23:17 123_20190911_110012.txt
-rw-r--r-- 1 vipin vipin 2 Sep 11 23:17 123_20190910_110010.txt
-rw-r--r-- 1 vipin vipin 2 Sep 11 23:17 1234_20190911_110011.txt
-rw-r--r-- 1 vipin vipin 2 Sep 11 23:17 1234_20190911_110012.txt
-rw-r--r-- 1 vipin vipin 2 Sep 11 23:17 1234_20190910_110010.txt

이 경우 2개의 디렉터리 123과 1234와 파일이 다음과 같은 디렉터리로 이동될 것으로 예상합니다.

Dir 123 has files
 123_20190911_110011.txt
 123_20190911_110012.txt
 123_20190910_110010.txt
Dir 1234 has files
 1234_20190911_110011.txt
 1234_20190911_110012.txt
 1234_20190910_110010.txt

아래 코드는 작동하지 않습니다. 디렉토리가 생성되지도 않고 오류도 표시되지 않습니다.

for i in `ls -p | grep -v /` ## to list only files
do 
echo $i | awk -F'_' '{mkdir -p $1; cp $i $1}'
done

다음 명령을 사용하여 디렉터리를 생성할 수 있는데 이동 명령을 어떻게 추가합니까?

for i in `ls -p | grep -v / `; do echo $i | awk -F'_' '{print $1; dir= $1}' | xargs mkdir -p ; done

답변1

내부에서 하거나 해서는 안 됩니다 mv. 다음은 작동합니다:cpawk

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="$(echo $i | awk -F'_' '{print $1}')"
  mkdir -p -- "$dir_name"
  cp -- "$i" "$dir_name"
done

awk그러나 %bash에서 연산자를 사용하면 첫 번째 밑줄 뒤의 모든 항목을 제거하여 대신 디렉터리 이름을 얻을 수 있습니다.

for i in * ; do
  [ -f "$i" ] || continue
  dir_name="${i%%_*}"
  mkdir -p -- "$dir_name"
  cp -- "$i" "$dir_name"
done

(이동을 원하시면 mv대신 이용해주세요)cp

답변2

모든 파일 이름을 샘플 파일에 넣고 아래 단계를 따르세요.

#step1 it creates directory

awk -F "_" '{print $1}' samplefile | awk '{if (!seen [$1]++)print "mkdir" " " $0}'| sh

#step2: moves file to respective directory

 for i in `awk -F "_" '{print $1}' samplefile | sort -u` ; do sed -n '/^'$i'_/p' samplefile | awk -v i="$i" '{print "mv" " " $1 " " i}'|sh ; done

관련 정보