죽은 하드 드라이브에서 내 음악 라이브러리를 복원해야 했습니다...모든 음악 트랙 이름 끝에 _000이 추가된 것을 제외하고는 내가 원하는 모든 것을 얻었습니다.
저는 8000개의 개별 음악 트랙을 검색하고 이름 바꾸기를 선택하여 _000 문자열을 제거하는 것을 정말 좋아하지 않습니다.
모든 앨범 하위 디렉터리가 포함된 전체 음악 폴더를 검색하고 모든 개별 트랙 이름에서 _000을 모두 제거하려면 어떻게 해야 합니까?
답변1
mikesrv 솔루션이 더 좋고 안전하지만 다음을 통해 수행할 수도 있다고 생각합니다.이름을 바꿔라:
find Music/ -type f -name '*_000' -print0 | xargs -r0 rename -v '_000' ''
그러나 위에서 언급한 것처럼 분명히 원하는 동작이 아닌 것으로 album_00020_000
이름을 바꾸는 등의 잠재적인 문제가 여전히 있습니다 . 나는 데비안 배포판이 도구 라고 생각한다album20
perl
이름을 바꿔라할 수 있습니다. 하지만 아쉽게도 설치할 수 있는 방법을 찾을 수 없습니다. 그래서 다음 perl
스크립트를 찾았습니다.여기충분 해:
#!/usr/bin/perl -w
# rename - Larry's filename fixer
$op = shift or die "Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}
따라서 스크립트를 실행 가능하게 만들고 다음을 실행할 수 있습니다.
find Music/ -type f -name '*_000' | /path_to_script/rename.pl 's/_000$//'
답변2
cd Music/.. &&
mkdir Music2 &&
pax -'rwls|\([^/]\)_000$|\1|p' Music Music2
의 상위 디렉토리 에서 실행하는 경우 위 명령은 Music
하드 링크가 있는 미러 경로 구조에 Music2
then 이라는 디렉토리를 생성 Music
하고 그 안에 있는 파일 이름 끝에 있는 find 항목을 모두 제거합니다.Music2
_000
Music
그 후에는 본질적으로 콘텐츠에 대한 두 가지 경로가 있습니다 Music/..
. 하나는 일부 파일 이름이 후행 문자열로 지정되는 경로이고, 다른 경로는 각 파일 이름이 다른 것보다 _000
하나 적은 문자열 로 끝나는 경로입니다._000
_000
(이름만 지정되고 변경되지 않은 파일은 제외)- 단, 실제 파일에는 영향을 미치지 않습니다. 이것이 Music2/Music
당신에게 더 적합하다고 생각되면 rm -rf Music
나중에 mv Music2/Music Music
.
모든 것이 Music
동일한 마운트된 파일 시스템에 있고 하드 링크를 지원한다고 가정합니다.
아래에 사용된 것들은 perl-rename
다음에서 사용 가능합니다.cpan.org존재하다~페더스트/이름 바꾸기. Arch Linux 시스템에 설치했습니다.pacman
. 이제 또 하나 있다고 들었는데,더 안전한동일한 이름의 perl-script는 다음 위치에서도 찾을 수 있습니다.cpan.org/~rmbarker/File-Rename-0.20. 하지만 해당 기능을 작동시키는 데 성공하지 못했습니다. 하지만 이 실패는 나의 무능력과 관련이 있을 가능성이 더 높습니다.
어쨌든, 스크립트 기반 이름 바꾸기 솔루션과 패턴 기반 하드 링크의 위험성에 대한 간단한 사례 연구는 다음과 같습니다.
mkdir Music Music2
echo file1 >Music/file
echo file2 >Music/file_000
pax -'rwls|_000$||p' Music Music2
p
위의 -s
대체 옵션 으로 rint 플래그를 사용하고 있으므로 인쇄합니다 pax
.pax
오직모든 파일을 연결하더라도 파일 이름이 변경됩니다. 다음과 같이 인쇄됩니다.
Music/file_000 >> Music/file
이제 어떻게 하는지 살펴보겠습니다.
grep . /dev/null Music/* Music2/Music/*
산출
Music/file:file1
Music/file_000:file2
Music2/Music/file:file2
잘. 미러 작업을 실행할 때 링크 file
결과는 file_000
기존 디렉터리 항목을 덮어씁니다. file
하지만 이 경우에는 원본 링크가 여전히 존재하므로 파일도 존재합니다. 파일의 기존 디렉터리에 dentry 복사본의 복사본을 보관하는 것 외에도pax
(기본적으로) -p
디렉터리를 생성해야 했기 때문에 생성하거나 복사해야 했던 파일에 관계없이 보존할 수 있는 모든 파일 속성을 보존합니다.(하드링크는 불가능)소스가 다른 파일 시스템에 있는 경우(완전히 피할 수 있음 -X
)복사해야 합니다.
따라서 두 개의 서로 다른 디렉토리를 비교할 수 있습니다나중에차이를 위해앞으로취소할 수 없는 변경을 수행합니다. rint 플래그를 통해 p
제공되는 결과를 가져와 기존 원본 파일과 상호 참조할 수 있습니다. 만약 존재한다면 새 대상에서는 최소한 파일을 꺼리는 것입니다.
그러나 다른 일면에서는:
find Music -name \*_000 -exec perl-rename 's/_000$//' {} +
grep . /dev/null Music/*
산출
Music/file:file2
언제마지막파일의 파일 시스템 링크를 덮어썼습니다. 파일은 기록입니다.
답변3
사용find
이 명령은 디렉터리와 해당 하위 디렉터리의 파일을 반복적으로 열거합니다. 파일 이름을 바꾸는 방법에는 여러 가지가 있습니다. 리눅스를 사용할 수 있습니다rename
주문하다:
find Music -depth -name '*_000' -exec rename _000 '' {} \;
_000
이렇게 하면 각 파일 이름의 첫 번째 항목이 제거됩니다. 파일 이름이 중간에 포함되어 있으면 _000
원하는 이름이 제공되지 않습니다 .
Debian 및 그 파생 제품(Ubuntu, Mint 등)에서는 rename
명령이 다릅니다. Linux에서는 이라고 하며 rename.ul
다음 rename
과 같이 사용할 수 있습니다( _000
중간에 하나가 있더라도 항상 끝에 있는 것을 제거합니다).
find Music -depth -name '*_000' -exec rename 's/_000$//' {} +
이러한 파일의 이름을 바꾸는 더 쉬운 방법은 다음을 설치하는 것입니다.다루기 힘든(대부분의 배포판에서 사용 가능)zmv
기능. 그런 다음 실행 autoload -U zmv
(또는 삽입)~/.zshrc
zmv 'Music/**/*_000' '${f%_000}'