서로 다른 하위 폴더에 비슷한 이름을 가진 파일이 많이 있는 상황이 발생했습니다(그러나 모두 특정 패턴을 따랐습니다).
file1
file1 (Copy)
/folder1/file2.txt
/folder1/file2 (Copy).txt
/folder1/file3.png
/folder1/file3 (Copy).png
각 파일은 복사본과 동일한 폴더에 있으며 (Copy)
이름 끝에 있다는 점을 제외하면 확장자가 동일합니다.
file1 (Copy)
이 모든 파일을 가져오고 가장 오래된 파일을 삭제한 다음 결국 파일 이름을 바꿔야 하는 경우 ( file1
예: 접미사 제거) 파일 이름을 바꾸고 싶습니다 .(Copy)
사용하려고 하는데 find
가장 mv
가까운 것을 이동하라고 어떻게 말해야 할지 모르겠습니다.
답변1
확장하다find
+bash
솔루션(GNU 구현도 필요함 stat
):
find . -type f -name "* (Copy).*" -exec bash -c 'p="${0%/*}"; bn="${0##*/}";
main_bn="${bn/ (Copy)/}";
if [ -f "$p/$main_bn" ]; then
t_copy_file=$(stat -c %Y "$0"); t_main_file=$(stat -c %Y "$p/$main_bn");
if [[ $t_copy_file -gt $t_main_file ]]; then
mv "$0" "$p/$main_bn";
else
rm "$0";
fi;
fi' {} \;
p="${0%/*}"
- 기본 이름이 잘린 파일 경로/경로bn="${0##*/}"
- 파일의 기본 이름main_bn="${bn/ (Copy)/}"
(Copy)
- 가져오려면 기본 이름에서 하위 문자열을 제거하세요.메인/퍼블릭기본 이름if [ -f "$p/$main_bn" ]
- 만약에메인/원본파일이 존재합니다(심볼릭 링크 확인 후 일반 파일로 확인됨).t_copy_file=$(stat -c %Y "$0")
- 마지막으로 수정된 시간을 확인하세요."복사"문서t_main_file=$(stat -c %Y "$p/$main_bn")
- 마지막으로 수정된 시간을 가져옵니다.원래문서if [[ $t_copy_file -gt $t_main_file ]]
- 만약에"복사"파일이 최근임 - 다음으로 이동원래에(만들어봐원래) 그리고mv "$0" "$p/$main_bn"
- 그렇지 않으면원래파일이 최신입니다. '삭제하세요.복사"문서와
rm "$0"
-nt
또는 파일 테스트 연산자를 사용하여 더 짧은 것( - 이후에 변경되었는지 또는 존재하지만 존재하지 않는지 [ newerfile –nt olderfile ]
확인 ):newerfile
olderfile
newerfile
olderfile
find . -type f -name "* (Copy).*" -exec bash -c 'p="${0%/*}"; bn="${0##*/}";
main_bn="${bn/ (Copy)/}";
if [ -f "$p/$main_bn" ]; then
if [ "$0" -nt "$p/$main_bn" ]; then
mv "$0" "$p/$main_bn";
else
rm "$0";
fi;
fi' {} \;
답변2
사용하기가 더 쉬울 수 있습니다 zsh
.
setopt extendedglob # best in ~/.zshrc
for file (./**/?*" (Copy)"*(ND.)) {
base=$file:h/${${file:t}/" (Copy)"}}
[[ ! -f $base || -L $base ]] ||
if [ $file -nt $base ]; then
mv $file $base
else
rm -f $file
fi
}
파일이 없는지 먼저 확인하는 것이 좋습니다 file (Copy) (Copy).txt
.
**/
: 모든 수준의 하위 디렉터리N
:빈 공일치하는 항목이 없으면 오류 대신 비어 있는 상태로 확장됩니다.D
:숨겨진 파일(D
또는 파일)을 포함하고 숨겨진 디렉터리에 놓습니다..
:만 포함정기적인파일(디렉토리, fifo, 장치, 심볼릭 링크 없음...)$file:h
:머리파일(디렉토리 부분), 예:csh
$file:t
:꼬리(파일명 부분)${var/pattern/replacement}
, 여기에는 대체품이 없습니다.[[ ! -f $base || -L $base ]] ||...
보호 조치로 틀에 얽매이지 않는 파일이나 기호 링크(일반 파일을 가리키는 경우에도)를 건너뜁니다.[ $file -nt $base ]
$file
: 마지막으로 수정된 경우 true를 반환합니다.뒤쪽에$base
(또는$base
위의 확인 후에 발생해서는 안 되는 접근성).