명령을 사용하지 않고 상위 디렉터리 이름 앞에 추가된 파일의 이름을 일괄 변경해야 합니다 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" -prune
archive
디렉터리 자체는 포함되지 않습니다 .${1/\//_}
/
슬래시를 밑줄로 바꾸세요_
. 전달된 파일 경로인1
첫 번째 매개변수를 가리킵니다 .find_bash
{}
( 파일 복사 또는 이동 echo
으로 대체)cp
mv
디렉토리 구조:
.
├── 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