앞에 추가된 상위 디렉터리 이름을 사용하여 파일 이름 바꾸기

앞에 추가된 상위 디렉터리 이름을 사용하여 파일 이름 바꾸기

명령을 사용하지 않고 상위 디렉터리 이름 앞에 추가된 파일의 이름을 일괄 변경해야 합니다 rename.

예를 들어

/tmp/2017-09-22/cyber.gz
/tmp/2017-09-23/cyber.gz
/tmp/2017-09-24/cyber.tar

/tmp/archive이름이 변경된 파일도 위에 언급된 원본 파일에 영향을 주지 않고 복사되어야 합니다 .

아래와 같습니다

/tmp/archive/2017-09-22_cyber.gz
/tmp/archive/2017-09-23_cyber.gz
/tmp/archive/2017-09-24_cyber.tar

답변1

여기서 사용하지 않으면 rename다음을 수행할 수 있습니다.Shell (Bash, ksh, ksh93, mksh, zsh) Pattern substitution expansion.

find * -path "archive" -prune -o -type f -exec \
    bash -c 'echo "$1" "archive/${1/\//_}"' find_bash '{}' \;
  • -path "archive" -prunearchive디렉터리 자체는 포함되지 않습니다 .

  • ${1/\//_}/슬래시를 밑줄로 바꾸세요 _. 전달된 파일 경로인 1첫 번째 매개변수를 가리킵니다 .find_bash{}

( 파일 복사 또는 이동 echo으로 대체)cpmv

디렉토리 구조:

.
├── 2017-09-22
│   └── cyber.gz
├── 2017-09-23
│   └── cyber.gz
├── 2017-09-24
│   └── cyber.tar
└── archive

명령을 실행한 후:

.
├── 2017-09-22
│   └── cyber.gz
├── 2017-09-23
│   └── cyber.gz
├── 2017-09-24
│   └── cyber.tar
└── archive
    ├── 2017-09-22_cyber.gz
    ├── 2017-09-23_cyber.gz
    └── 2017-09-24_cyber.tar

답변2

짧은 쉘 스크립트를 사용하십시오.

#!/bin/sh

archive='/tmp/archive'

mkdir -p "$archive"

for name in /tmp/????-??-??/*; do
    dirdate=${name%/*}         # dirdate=$(dirname "$name")
    dirdate=${dirdate##*/}     # dirdate=$(basename "$dirdate")

    newname="$archive/${dirdate}_${name##*/}"

    if [ ! -e "$newname" ]; then
        echo cp "$name" "$newname"
    fi
done

dirdate이는 날짜로 명명된 디렉터리의 기본 이름을 선택 하고 이를 사용하여 내부의 각 파일에 대한 새 이름을 만듭니다.

새 이름이 디렉터리에 없으면 archive파일이 해당 디렉터리에 복사됩니다.

echo실제로 복사를 수행하기 위해 위 스크립트에서 제거되었습니다 .

주어진 예에서 스크립트는 다음을 수행합니다.

cp /tmp/2017-09-22/cyber.gz /tmp/archive/2017-09-22_cyber.gz
cp /tmp/2017-09-23/cyber.gz /tmp/archive/2017-09-23_cyber.gz
cp /tmp/2017-09-24/cyber.tar /tmp/archive/2017-09-24_cyber.tar

관련 정보