폴더 내의 디렉터리 목록 이름을 바꾸는 스크립트를 작성하려고 합니다. 이것은 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-rename
prename
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
-t
Eric이 설명했듯이 옵션을 제거하면 솔루션이 작동합니다.
파일 이름의 비트를 이동하는 대신 변수 대체를 사용하는 awk
대체 솔루션은 다음과 같습니다.
for name in '['*; do
tag="${name%% *}"
title="${name#* }"
mv "$name" "$title - $tag"
done
${name%% *}
첫 번째 공백$name
(공백 포함) 뒤의 모든 내용을 제거하고${name#* }
첫 번째 공백까지 포함하여 모든 항목을 제거합니다.