누락된 파일과 관련된 질문이 mv
제 질문에 대한 답변이 아닌 것 같습니다. 파일이 있는 작업 디렉터리에서 다음 명령을 실행하면 파일이 손실됩니다.
1 단계
$layers
다음을 사용하여 생성된 파일 이름의 정렬된 배열이 있습니다 layers=$(ls cropped* | sort -nk1.9)
.
IFS=$'\n';for file in $layers; do echo $file; done
cropped_1.png
cropped_2-a.png
cropped_2-b.png
cropped_2.png
cropped_3-a.png
cropped_3-b.png
cropped_3.png
cropped_4-a.png
cropped_4-b.png
cropped_4-c.png
cropped_4-d.png
cropped_4-e.png
cropped_4-f.png
cropped_4-g.png
cropped_4.png
cropped_5-a.png
cropped_5-b.png
cropped_5.png
--More--
2 단계
각 파일 이름에서 _ 뒤의 모든 항목을 바꾸기 위해 다음 루프를 실행합니다.
i=1;IFS=$'\n';for file in $layers; do echo ${file/#*_*/cropped_$((i++)).png}; done
cropped_1.png
cropped_2.png
cropped_3.png
cropped_4.png
cropped_5.png
cropped_6.png
cropped_7.png
cropped_8.png
cropped_9.png
cropped_10.png
cropped_11.png
cropped_12.png
cropped_13.png
cropped_14.png
cropped_15.png
cropped_16.png
cropped_17.png
--More--
3단계 - 위험해요, 윌 로빈슨!
지금까지는 좋아 보입니다. 그래서 다음 루프를 사용하여 각 파일의 이름을 바꾸려고 시도했는데 mv
, 그 결과는 mv cropped_2-a.png cropped_2.png
다음 과 같습니다 mv cropped_2-b.png cropped_3.png
.
i=1;IFS=$'\n';for file in $layers; do mv $file ${file/#*_*/cropped_$((i++)).png}; done
이로 인해 첫 번째 파일에 오류가 발생했습니다.
mv: 'cropped_1.png'와 'cropped_1.png'는 동일한 파일입니다.
일치하는 모든 파일 이름에 대해 이 오류가 발생한다고 생각합니다 mv SOURCE DEST
. 대신 루프의 첫 번째 파일에서만 오류가 발생합니다.
이상하게도 지금은 많은 파일이 누락되었습니다. 유일하게 남은 파일은 다음과 같습니다.
ls cropped* | sort -nk1.9
cropped_1.png
cropped_141.png
cropped_142.png
cropped_143.png
cropped_144.png
cropped_145.png
cropped_146.png
cropped_147.png
cropped_148.png
cropped_149.png
cropped_150.png
cropped_151.png
cropped_152.png
cropped_153.png
cropped_154.png
cropped_155.png
질문
손실된 파일은 어디로 옮겨졌나요?
중복된 이름의 파일을 만들기 전에는 140개의 파일이 있어서 cropped_2-a.png
총 155개의 파일이 있었습니다. 141-155 파일이 성공적으로 이동된 경우 2-140 파일은 어디에 있습니까? 왜 그들은 의도한 목적지로 이동하지 않는 걸까요? 현재 작업 디렉토리?
노트
이름이 인 파일을 추가하지 않으면 cropped_2-a.png
루프는 각 파일에 대해 오류 메시지를 표시하고 파일은 변경되지 않은 상태로 유지됩니다.
i=1;IFS=$'\n';for file in $layers; do mv $file ${file/#*_*/cropped_$((i++)).png}; done
mv: ‘cropped_1.png’ and ‘cropped_1.png’ are the same file
mv: ‘cropped_2.png’ and ‘cropped_2.png’ are the same file
mv: ‘cropped_3.png’ and ‘cropped_3.png’ are the same file
mv: ‘cropped_4.png’ and ‘cropped_4.png’ are the same file
mv: ‘cropped_5.png’ and ‘cropped_5.png’ are the same file
--More--
cropped_2a.png
(no ) -
와 같은 파일 이름을 사용하여 테스트했는데 파일 누락 문제가 중복됩니다.
mv -v
무슨 일인지 확인해 보니 예상대로 파일 이름이 바뀌는 것 같았는데 확인해 보니 파일이 없어졌습니다. 패키징 매개변수 교체1 ${file/#*_*/cropped_$((i++)).png}
큰따옴표로 묶어도 이 문제는 해결되지 않습니다.
i=1;IFS=$'\n';for file in $layers; do mv -v $file "${file/#*_*/cropped_$((i++)).png}"; done
‘cropped_2-a.png’ -> ‘cropped_2.png’
‘cropped_2-b.png’ -> ‘cropped_3.png’
‘cropped_2.png’ -> ‘cropped_4.png’
‘cropped_3-a.png’ -> ‘cropped_5.png’
‘cropped_3-b.png’ -> ‘cropped_6.png’
‘cropped_3.png’ -> ‘cropped_7.png’
‘cropped_4.png’ -> ‘cropped_8.png’
‘cropped_5.png’ -> ‘cropped_9.png’
‘cropped_6.png’ -> ‘cropped_10.png’
--More--
mv
더 간단한 명령을 테스트하려면 매개변수 대체를 대상 매개변수로 사용하십시오.
testy="cropped_2-b.png"
mv -iv $testy ${testy/#*_*/cropped_999.png}
이것은 또한 작동합니다:
i=998
testy="cropped_2-b.png"
mv -iv $testy ${testy/#*_*/cropped_$((i++)).png}
'cropped_2-b.png' -> 'cropped_998.png'
testy="cropped_3-a.png"
mv -iv $testy ${testy/#*_*/cropped_$((i++)).png}
'cropped_3-a.png' -> 'cropped_999.png'
동일한 파일 오류 중에 for 루프가 실패하는 이유나 파일이 실제로 어디로 가는지 알 수 없습니다.
답변1
cropped_2-a.png
로 이름이 변경되었습니다 cropped_2.png
. 이는 원본을 대체한 cropped_2.png
다음 2줄 후에 파일 이름이 cropped_4.png
.
이 문제를 피하는 가장 좋은 방법은 번호를 다시 매길 때 처음에 비어 있는 다른 디렉터리로 파일을 이동하는 것입니다. 그러면 새 이름이 이전 이름과 충돌하는 것에 대해 걱정할 필요가 없습니다. 그런 다음 루프가 완료되면 이름이 바뀐 파일을 원래 디렉터리로 다시 이동할 수 있습니다.