텍스트 파일을 사용하여 파일 및 폴더 이름 바꾸기

텍스트 파일을 사용하여 파일 및 폴더 이름 바꾸기

공백으로 구분된 텍스트 파일을 사용하여 파일과 디렉터리의 이름을 바꾸려고 합니다.

이것파일.txt다음과 같습니다.

dir1-1 dir1_1
dir2-1 dir223_1

내 명령은 다음과 같습니다.

xargs -r -a **files.txt** -L1 mv

파일은 다음과 같습니다(디렉토리 1).

dir1-1.txt dir1-1.gzip dir1-1-something.text

파일의 출력은 다음과 같아야 합니다(dir1-1).

dir1_1.txt dir1_1.gzip dir1_1-something.text

디렉터리(dir2)의 파일은 다음과 같습니다.

dir2-1.py dir2-1.txt dir2-1.text

출력은 다음과 같아야 합니다.

dir223_1.py dir223_1.txt dir223_1.text

이 명령은 폴더 이름을 dir1-1에서 dir1_1로, dir2-1에서 dir223_1so로만 바꿀 수 있지만 하위 디렉터리의 파일 이름은 바꾸지 않습니다. 해당 디렉터리의 파일에도 이러한 디렉터리의 접두사가 있습니다. (예: dir1-1.txt dir1-1.gzip dir1-1.csv)

그것은 다음과 같습니다: 대체 파일 이름이 포함된 텍스트 파일을 사용하여 파일 이름을 바꾸는 스크립트

당신의 도움을 기대합니다.

답변1

이를 수행하는 방법은 여러 가지가 있지만 다음은 한 가지 접근 방식을 설명하는 매우 간단하고 간단한 예입니다.

$ cat files.txt 
dir1-1 dir1_1
dir2-1 dir223_1

$ cat rename.sh
#!/bin/bash

# make some dirs and files to test with:
d='dir1-1'; mkdir "$d"; for ext in .txt .gzip -something.txt; do touch "$d/$d$ext" ; done
d='dir2-1'; mkdir "$d"; for ext in .py .txt .text; do touch "$d/$d$ext" ; done

# now rename them:
while read -r old new ; do
  # rename the directory too
  mv -v "$old" "$new"

  # and rename the files
  if [ -d "$new" ] ; then
    for f in "$new/"* ; do
      mv -v "$f" "$(printf "%s" "$f" | sed -e "s/$old/$new/g")"
    done
  fi
  echo
done < files.txt

$ chmod +x rename.sh

$ ./rename.sh 
renamed 'dir1-1' -> 'dir1_1'
renamed 'dir1_1/dir1-1.gzip' -> 'dir1_1/dir1_1.gzip'
renamed 'dir1_1/dir1-1-something.txt' -> 'dir1_1/dir1_1-something.txt'
renamed 'dir1_1/dir1-1.txt' -> 'dir1_1/dir1_1.txt'

renamed 'dir2-1' -> 'dir223_1'
renamed 'dir223_1/dir2-1.py' -> 'dir223_1/dir223_1.py'
renamed 'dir223_1/dir2-1.text' -> 'dir223_1/dir223_1.text'
renamed 'dir223_1/dir2-1.txt' -> 'dir223_1/dir223_1.txt'

참고: files.txt파일 및 디렉터리 이름에는 이전 패턴과 새 패턴을 구분하는 공백이 있고 read기본 IFS 설정 $' \t\n'(공백, 탭 또는 줄 바꿈)을 사용하고 있기 때문에 다음 스크립트는 다음 스크립트를 포함하지 않는 모든 파일 이름 패턴에 대해 작동합니다. 이러한 문자(또는 /에서 구분 기호로 사용되므로 a sed)입니다.

관련 정보