파일 이름을 상위 폴더 이름으로 바꾸기

파일 이름을 상위 폴더 이름으로 바꾸기

각각 자체 하위 디렉터리에 여러 개의 파일이 있습니다. 각 파일의 이름을 디렉터리와 동일한 이름으로 바꾸는 스크립트를 작성해야 합니다. 예를 들면 다음과 같습니다.

./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

관련 정보