여러 파일에서 _000의 모든 인스턴스를 제거합니다.

여러 파일에서 _000의 모든 인스턴스를 제거합니다.

죽은 하드 드라이브에서 내 음악 라이브러리를 복원해야 했습니다...모든 음악 트랙 이름 끝에 _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하드 링크가 있는 미러 경로 구조에 Music2then 이라는 디렉토리를 생성 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}'

관련 정보