간단한 bash 스크립트 오류 - mv + awk

간단한 bash 스크립트 오류 - mv + awk

폴더 내의 디렉터리 목록 이름을 바꾸는 스크립트를 작성하려고 합니다. 이것은 bash 스크립트이며 이 작업을 수행하기 위해 awk만 사용합니다.

현재 형태:

[2015] Name of the album

필수 양식:

Name of the album - [2015]

내 스크립트:

#! /usr/bin/env bash
for f in \[*; do
    mv -t "$f" "$( awk -F '\] ' ' {print $2 " - " $1 "]"}' <<<"$f" )"
done

위 스크립트를 실행하면 다음과 같은 오류가 발생합니다.

mv: cannot stat 'In Dreams [EP] - [1963]': No such file or directory

답변1

-t당신은 당신의 상황에서 그것을 원하지 않습니다 . 그러면 mv원하는 이름을 이라는 디렉터리로 이동하라는 메시지가 표시됩니다 $f.

다음과 같이 확장됩니다.

mv -t "[2015] Name of the album" "Name of the album - [2015]"

그렇지 않다면 아마도 이것이 당신이 원하는 것일 것입니다 -t. 이는 $f대상 디렉터리 이름 으로 있는 그대로 처리되며 다른 모든 매개변수는 해당 디렉터리로 이동되어야 합니다.

답변2

액세스 권한이 있는 경우 perl-rename( Ubuntu, Arch 등을 rename포함한 Debian 기반 시스템에서 호출됨 ) 다음을 수행할 수 있습니다.perl-renameprename

perl-rename -n 's/(\[.*?\])\s*(.*)/$2 - $1/' ./\[*

설명하다

  • -n: 이를 통해 perl-rename인쇄는 실제로 이름을 바꾸지 않고도 작업을 수행할 수 있습니다. 이렇게 실행하고 예상대로 작동하는 것처럼 보이면 삭제하여 -n실제로 이름을 바꾸세요.
  • s/from/to/from: 로 대체됩니다 to.
  • s/(\[.*?\])\s*(.*)/$2 - $1/': 여기에는 from첫 번째 [와 첫 번째 ]( ) \[.*?\]사이의 모든 내용이 있습니다. 그런 다음 0개 이상의 공백 문자( \s*), 기타 모든 문자( .*)입니다. 패턴 주위의 괄호는포착$1그들, 각각을 교체 의 우변 으로 사용하자 $2. 따라서 [ ]( ) $2이후의 모든 내용은 $1대괄호 ( ) 앞에 배치됩니다.
  • ./\[*. 로 끝나는 현재 디렉토리의 이름에 대해 [.

답변3

-tEric이 설명했듯이 옵션을 제거하면 솔루션이 작동합니다.

파일 이름의 비트를 이동하는 대신 변수 대체를 사용하는 awk대체 솔루션은 다음과 같습니다.

for name in '['*; do
    tag="${name%% *}"
    title="${name#* }"
    mv "$name" "$title - $tag"
done
  • ${name%% *}첫 번째 공백 $name(공백 포함) 뒤의 모든 내용을 제거하고
  • ${name#* }첫 번째 공백까지 포함하여 모든 항목을 제거합니다.

관련 정보