각각 자체 하위 디렉터리에 여러 개의 파일이 있습니다. 각 파일의 이름을 디렉터리와 동일한 이름으로 바꾸는 스크립트를 작성해야 합니다. 예를 들면 다음과 같습니다.
./1111/1234.pdf
./2222/2345.pdf
./1234/3214.pdf
이름을 다음과 같이 바꿔야 합니다.
./1111/1111.pdf
./2222/2222.pdf
./1234/1234.pdf
어떻게 해야 하나요?
답변1
쉘이 zsh라고 가정하고 autoload -U zmv
쉘을 입력 ~/.zshrc
하고 실행하십시오.
zmv '(*)/*.pdf' '$1/$1.pdf'
답변2
다음 bash
스크립트는 상위 디렉터리에서 호출될 때 작업을 실행합니다. 파일의 확장자가 모두 동일하지는 않더라도(제한된 예에서는 동일하지만 우연의 일치일 수 있음) 다음을 수행합니다.
#!/bin/bash
function dirnametofilename() {
for f in $*; do
bn=$(basename "$f")
ext="${bn##*.}"
filepath=$(dirname "$f")
dirname=$(basename "$filepath")
mv "$f" "$filepath/$dirname.$ext"
done
}
dirnametofilename ./????/*
여기서 호출에서는 현재 디렉터리의 하위 디렉터리에 있는 모든 파일의 이름이 4자를 포함하는 것으로 가정합니다. 마지막 줄을 다음으로 바꿀 수 있습니다.
dirnametofilename $*
파일 이름을 스크립트에 대한 인수로 지정합니다.
아래에서는 더 깊은 계층 구조를 만들고 find를 사용하여 파일을 찾습니다. export -f
런처가 bash
기능 find
을 이해하는지 확인하세요 .
mkdir -p x/y/z/1111 x/y/z/2222 x/y/z/1234
touch x/y/z/1111/1234.pdf
touch x/y/z/2222/2345.pdf
touch x/y/z/1234/3214.pdf
function dirnametofilename() {
for f in $*; do
bn=$(basename "$f")
ext="${bn##*.}"
filepath=$(dirname "$f")
dirname=$(basename "$filepath")
mv "$f" "$filepath/$dirname.$ext"
done
}
export -f dirnametofilename
find . -name "*.pdf" -exec bash -c 'dirnametofilename "{}"' \;
# and look at the result
find x
답변3
echo ./1111/1234.pdf | perl -pe '$_.=$_; s/\/(.*?)\/.+\.(.*?)$/\/$1\/$1\.$2/' | xargs -n 2 mv