Linux에서 파일 이름을 기반으로 여러 디렉터리를 만들고 파일 이름을 변경하는 방법은 무엇입니까?

Linux에서 파일 이름을 기반으로 여러 디렉터리를 만들고 파일 이름을 변경하는 방법은 무엇입니까?

AllData다음과 같은 파일이 포함된 디렉터리가 있습니다 .

AllData
 |____ file_1to1000.track
 |____ file_1001to2000.track
 |____ file_2001to3000.track

파일명을 기준으로 해당 파일명으로 디렉터리를 생성했습니다.

for file in *; do dir=$(echo $file | cut -d. -f1); mkdir -p $dir; mv $file $dir; done

그 안에 다른 디렉토리를 만들고 파일을 보관하고 싶습니다. 다음과 같아야 합니다.

AllData
 |__ file_1to1000
          |___ cuffcompare
                   |____ file_1to1000.track

 |__ file_1001to2000
          |___ cuffcompare
                   |____ file_1001to2000.track

 |__ file_2001to3000
          |___ cuffcompare
                   |____ file_2001to3000.track

파일을 위 디렉터리로 옮긴 후에는 파일 이름 file_1to1000.track이 에서 로 변경되어야 합니다 soft.track. 디렉터리의 모든 파일은 원래 파일 이름에서 으로 변경되어야 합니다. soft.track기본적으로 다음과 같아야 합니다.

AllData
 |__ file_1to1000
          |___ cuffcompare
                   |____ soft.track

 |__ file_1001to2000
          |___ cuffcompare
                   |____ soft.track

 |__ file_2001to3000
          |___ cuffcompare
                   |____ soft.track

답변1

확인하다:

for file in ./*; do
    echo mkdir -p "${file%.*}"/cuffcompare/ && \
    echo mv "$file" "$_"soft.track
done

라이너로:

for file in ./*; do echo mkdir -p "${file%.*}"/cuffcompare/ && echo mv "$file" "$_"soft.track; done

참고: echo테스트 실행 결과가 만족스러우면 위 항목을 삭제하세요.


${file%.*}파일 이름에서 일치하는 가장 짧은 접미사를 제거합니다. 그래서 .track여기서는 파일 이름 끝부터 자르기 시작합니다. 모두 다 아는매개변수 확장

$_이전 명령의 마지막 인수를 대체합니다(참조:쉘 특수 매개변수);다음으로 확장 "${file%.*}"/cuffcompare/;

따라서 발견된 각 파일에 대해 mkdir다음 디렉토리( -p또는 존재하지 않는 경우 상위 디렉토리를 생성하는 데 상위 디렉토리가 사용됨) 구조가 생성됩니다.

└── file_2001to3000
    └── cuffcompare

그런 다음 mv파일을 다음 soft.tarck이름의 관련 디렉터리로 이동하고 이름을 바꿉니다.

└── file_2001to3000
    └── cuffcompare
        └── soft.track

관련 정보