(디스크 전체에서) 한 파일을 다른 파일(둘 다 동일한 경로에 있음)로 검색하고(일치하는 경우) 바꿔야 합니다.
예:
Folder 1
x*.txt (good) (e.g.: xFile.txt)
*.txt (bad) (e.g.: File.txt)
동일한 경로에 있는 두 파일이 일치하면 :를 제거 *.txt (e.g.: File.txt)
하고 :의 이름을 다음 x*.txt (e.g.: xFile.txt)
으로 바꿔야 합니다.*.txt (e.g.: File.txt)
결과:
Folder 1
*.txt (e.g: File.txt... old xFile.txt)
나는 다음 명령을 사용합니다.
find -name 'x*.txt' | sed -r 'p;s/g([^\/]*.txt)/\1/' | xargs -d '\n' -n2 mv
문제는 명령을 실행하기 전에 명령이 두 파일이 모두 존재하는지(xFile.txt와 File.txt가 동일한 경로에 있음) 확인하지 않는다는 것입니다.
어떻게 해결할 수 있나요? 미리 감사드립니다
답변1
GNU 도구를 사용하면 다음을 수행할 수 있습니다.
(export LC_ALL=C
find . -name '*.txt' -print0 |
sed -Ez 's|/x([^/]*)$|/\1|' |
sort -z |
uniq -zd |
sed -z 'h;s|.*/|&x|;G' |
xargs -r0n2 echo mv)
이름이 여러 개로 시작하는 파일이 없다고 가정합니다 x
. 예를 들어, 그러면 안 돼요mv ./xx.txt ./x.txt
답변2
먼저 작업을 수행하는 함수를 정의합니다.
switcheroo() {
[[ -f x"$1" ]] && mv -f x"$1" "$1"
}
export -f switcheroo
이제 우리는 find
버림받은 사람들을 반복하기 위해 몇 가지 어둠의 마법을 사용합니다.
find . -name \*.txt -execdir bash -c 'switcheroo "$0"' "{}" \;
우리는 이를 사용하여 확장자가 있는 find
모든 .txt
파일을 찾은 다음(원하는 기준에 맞게 구체화할 수 있음) switcheroo 프로세스를 통해 해당 파일을 실행합니다. 이 프로세스를 사용하여 [[ ... ]]
대체 파일이 존재하는지 테스트하고, 그렇다면 mv
대체 파일을 구현합니다. .