디렉토리의 여러 파일 이름에서 기호로 구분된 두 문자열을 바꿉니다.

디렉토리의 여러 파일 이름에서 기호로 구분된 두 문자열을 바꿉니다.

author - name일부 책의 파일 이름과 같은 문자열을 name - author. 노력하고있어

ls * | sed -r 's/(.+) - (.+).pdf/mv \2 - \1.pdf/' | sh

아마도 다음이 혼합된 것일 수도 있습니다. 기호로 구분된 두 개의 임의 길이 문자열 전환 그리고sed를 사용하여 여러 파일 이름 바꾸기

작동하지 않습니다.

for file in *; do mv "$file" "$(echo "$file" | sed -r 's/(.+) - (.+).pdf/\2 - \1.pdf/')"

둘 다 그렇지 않습니다

rename 's/\([.]+\) - \([.]+\)\.pdf/\2 - \1\.pdf/' *

이것은 작동합니다

rename 's/(.+) - (.+).pdf/\2 - \1.pdf/' *

답변1

이 시도

% ls -1                                                                                                       
001-foobar.pdf
002-foobar.pdf
003-foobar.pdf

암호

% rename -n 's/([^-]+)-([^\.]+)\.pdf/$2-$1.pdf/' *.pdf                                                          
001-foobar.pdf -> foobar-001.pdf
002-foobar.pdf -> foobar-002.pdf
003-foobar.pdf -> foobar-003.pdf

메모

(테스트가 정상이면 -n 스위치를 제거하십시오)

경고 이 작업을 수행할 수도 있고 수행하지 못할 수도 있는 같은 이름의 다른 도구가 있으므로 주의하세요.

다음 명령을 실행하면 ( GNU)

$ file "$(readlink -f "$(type -p rename)")"

그리고 당신은 다음과 같은 결과를 얻었습니다

.../rename: Perl script, ASCII text executable

다음을 포함하지 않음:

ELF

그렇다면 이것이 올바른 도구인 것 같습니다 =)

Debian그렇지 않은 경우 다음과 같은 파생 항목을 기본값(일반적으로 이미 적용됨)으로 설정합니다 Ubuntu.

$ sudo update-alternatives --set rename /path/to/rename

( /path/to/rename명령 경로로 바꾸십시오 perl's rename.


이 명령이 없으면 패키지 관리자를 검색하여 설치하거나수동으로 해라


마지막으로 이 도구는 원래 Perl의 아버지인 Larry Wall이 작성했습니다.

답변2

나는 파일 이름이 패턴을 따르고 author - name.pdf둘 다 author공백 으로 둘러싸인 name것 외에 유효한 문자를 포함할 수 있다고 가정합니다.-

find . -type f -name '* - *.pdf' \
    -execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;

이는 현재 디렉토리에서 패턴과 일치하는 이름을 가진 모든 일반 파일을 찾습니다 * - *.pdf.

이러한 각 파일에 대해 하위 쉘이 실행됩니다. 서브셸은 다음을 수행합니다.

b=${1% - *}  # pick out the start of the filename
e=${1#* - }  # pick out the end of the filename

# Combine $b and $e into a new filename while removing ".pdf" from
# the end of the original filename and adding it to the end of
# the new filename instead.
mv "$1" "${e%.pdf} - $b.pdf"

테스트하기:

$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Aug 30 11:31 arr! - Boaty McBoatface.pdf
-rw-r--r--  1 kk  wheel  0 Aug 30 11:30 hello world - bingo-night!.pdf

$ find . -type f -name '* - *.pdf' -execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;

$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Aug 30 11:31 Boaty McBoatface - arr!.pdf
-rw-r--r--  1 kk  wheel  0 Aug 30 11:30 bingo-night! - hello world.pdf

다시 실행하면 이름이 원래 이름으로 다시 바뀌게 됩니다.

관련 정보