다음 명령을 사용 하여 find
파일 구조(수백 개의 폴더, 약 4레벨 깊이)에서 실행했습니다 find "/media/$disk/_all" -depth -type d -exec/execdir rename -d 's/ 1000k/ [1000k]/' "{}" \;
. 1000k가 포함된 폴더 중 일부는 여전히 이름이 변경되지 않았음을 반복적으로 지적했으며, 그 중 일부는 두 번째로 이름이 변경되지 않은 것을 확인했습니다. 내가 실행한 시간에 명령의 이름이 바뀌었습니다. 처음부터 모두 실행해 보는 것은 어떨까요?
또한 출력에 "/media/some_original /media/some_renamed: 해당 파일 또는 디렉터리의 이름을 바꿀 수 없습니다"라는 메시지가 자주 표시되는 것을 확인했습니다. 그 후 some_original의 이름이 some_renamed로 성공적으로 변경되었습니다.
내 생각에 첫 번째 오류는 find가 모든 트리를 순회하지 않기 때문에 발생하고, 두 번째 오류는 find가 트리의 일부/전체를 수행하고 exec를 두 번 호출하기 때문에 발생하는 것입니다. 기입. 나중에 "하위" 폴더의 이름이 "상위" 폴더 이전에 바뀌었는지 확인하기 위해 -깊이 옵션을 추가했지만 도움이 되지 않았습니다(제 경우에는 오류를 발견했을 때 여러 수준이기 때문에 이를 인지하지 못했습니다). 이름 변경으로 인해 발생).
웹에서 검색해봐도 답이 안나오네요. 여기서 무엇이 잘못되었을 수 있습니까?
시스템은 리눅스 민트 20.1입니다.
추가됨: 확인했는데 ls -lR /path/to/folder | grep ^l from을 사용하여 구조에서 링크를 찾을 수 없습니다.https://stackoverflow.com/questions/8513133/how-do-i-find-all-of-the-symlinks-in-a-directory-tree.
디스크 설치 방법은 다음과 같습니다. ext4 (rw,nosuid,nodev,relatime,stripe=8191,uhelper=udisks2)를 입력합니다.
답변1
예비 설명
이 답변은 실제로 발생한 일에 대한 명확한 설명을 제공하기보다는 실제로 발생한 일을 설명하려는 시도입니다. 이 때문입니다:
- OP는 명령의 다양한 변형을 시도했습니다( 포함 또는 제외
-depth
, 포함-exec
또는 포함-execdir
). 질문 본문에 게시된 정확한 명령은 약간의 의미로 받아들여야 합니다. - 시도할 때마다 디렉터리 트리가 수정될 수 있지만 정확한 명령으로 인해 발생한 이름 변경을 나타내는 로그는 없습니다.
- 다시 말하지만, 오류 로그는 없습니다.
- 댓글과 채팅을 통해 문제를 분석한 결과 유사한 오류 메시지를 생성하는 문제가 거의 없다는 사실을 발견했습니다. 따라서 문제가 하나만 있다고 가정하기 쉽습니다.
이러한 이유로 단일 생성을 시도해 보십시오.MCVE(정확한 디렉토리 트리 및 정확한 명령의 형태로
find
) 실패합니다. 우리는 가능한 질문을 다루고 미래의 독자를 염두에 두고 답변을 작성하는 것이 최선이라는 데 동의했습니다. 이 대답이 바로 그것입니다.- OP는 명령의 다양한 변형을 시도했습니다( 포함 또는 제외
가지다하나 이상
rename
. 논의된 구문은rename
Larry Wall 및 Robin Barker와 관련된 Perl 스크립트에 적용됩니다. 이것이 사용되는 것 같아요rename
. 그러나 이 답변에서 다루는 문제는 이것에만 국한되지 않습니다rename
.
무슨 일이 일어났을지도 모르지
No such file or directory
사용하면서 find
몇 가지 다른 문제가 발생할 수 있습니다 rename
.
먼저 이 예를 단순화해 보겠습니다. 디렉토리 구조가 다음과 같다고 가정합니다.
/a/b/c.1/c.2/d
명령은 다음과 같습니다:
find /a/b -exec rename s/c/X/ {} \;
이 명령은 다음을 생성합니다.
find: '/a/b/c.1': No such file or directory
에 드랍을 시도하기 전의 -depth
find
과정이 없기 때문입니다. 처리하는 동안 이름이 다음과 같이 변경되지만 이름 변경을 인식하지 못합니다. 더 깊은 파일을 처리하려고 시도했지만 더 이상 존재하지 않습니다. 이는 다음과 매우 유사합니다.c.1
c.2
c.1
rename
X.1
find
c.1
c.1
find
그리고 사용rm -r
.
명령의 두 번째 반복에서는 로 이름이 바뀌고 /a/b/X.1/c.2/d
성공적으로 이름이 변경 c.2
됩니다 X.2
. c.2
세 번째 반복에서는 아무 작업도 수행하지 않고 아무 것도 불평하지 않습니다.
디렉토리 자체에 대한 작업을 수행하기 전에 find
처리할 디렉토리의 파일을 알려야 합니다. 그것이 -depth
목적입니다.
그렇더라도 -depth
여전히 문제가 있을 수 있습니다. 이번에도 다음과 같은 구조를 사용합니다.
/a/b/c.1/c.2/d
그리고 "fixed" 명령을 실행하세요:
find /a/b -depth -exec rename s/c/X/ {} \;
우리는 얻을 것이다:
Can't rename /a/b/c.1/c.2/d /a/b/X.1/c.2/d: No such file or directory
Can't rename /a/b/c.1/c.2 /a/b/X.1/c.2: No such file or directory
이 메시지의 출처는 명확하지 않지만 rename
사실입니다. d
먼저 문제를 처리 하고 rename
이를 . 예를 들어, 존재하지 않으면 이 작업을 수행할 수 없습니다. 나중에 (처리하는 동안 ) 아직 존재하지 않기 때문에 할 수 없습니다 ./a/b/c.1/c.2/d
/a/b/X.1/c.2/d
mv /a/b/c.1/c.2/d /a/b/X.1/c.2/d
/a/b/X.1/c.2/
c.2
mv /a/b/c.1/c.2 /a/b/X.1/c.2
X.1
(기본적으로 성공하지 못하는 것을 시도하면 놀랄 수도 있습니다 rename
. 명령이 mv /a/b/c.1/c.2/d /a/b/X.1/c.2/d
존재하지 않으면 성공하지 않는다는 점에 유의하십시오. 성공하더라도 여전히 잘 작동합니다. 이 경우 기본 동작도 정상입니다. ).X.1
X.1/c.2/
c.1/c.2/
rename
이 예에서는 의 이름이 자동으로 변경될 X.1
때 발생 하지만 나중에 발생합니다. 명령의 두 번째 반복에서는 처리 중에 오류가 발생 하고 이름을 바꾸려고 시도합니다 . 세 번째 반복에서는 아무 작업도 수행하지 않고 아무 것도 불평하지 않습니다.c.2
X.1
d
c.2
/c.0
not을 사용 /a
하고 명령이 no인 경우 find /c.0/b …
no rename
는 성공하고 반복 횟수는 헛되지 않습니다.
문제는 파일 이름이 아닌 디렉터리 구성 요소에 있음에도 불구하고 경로의 첫 번째 항목을 rename s/c/X/
변경하려고 하는 것 입니다. 이 문제를 해결하는 방법에는 최소한 두 가지가 있습니다.c
c
당신은 그것을 사용할 수 있습니다 rename -d
. 이 옵션은 rename
파일 이름에만 작동합니다. 다음 명령:
find /c.0/b -depth -exec rename -d s/c/X/ {} \;
성공을 (그래서 심지어 문제가 되지 않음) /c.0/b/c.1/c.2/d
로 변경합니다./c.0/b/X.1/X.2/d
c.0
-d
비교적 새로운 옵션입니다. 일반적으로 rename
지원하지 않을 수도 있습니다. 이 경우 -execdir
다음을 대신 사용하세요 -exec
.
find /c.0/b -depth -execdir rename s/c/X/ {} \;
(일반적으로 find
이를 지원할 수도 있고 지원하지 않을 수도 있습니다 -execdir
.)
작동하는 이유는 을 처리할 때 d
문자열이 rename
지금 처리되고 있기 때문입니다 . 마찬가지로 처리할 때는 가 ./d
아니라 입니다 . 이 도구는 매번 해당 상위 디렉터리에서 작동하므로 상대 경로가 작동합니다. 문자열에 전체 경로를 포함하지 않으면 없이 동작 하게 됩니다 ./c.0/b/c.1/c.2/d
c.2
./c.2
/c.0/b/c.1/c.2
rename -d
-d
거의 다 됐어요. rename
점으로 무언가를 수행 하려면 (예: 변경 c.2
등) c-2
처리해야 할 점은 or 입니다. 사용 여부에 관계없이 그런 문제가 없으므로 가능하면 사용하십시오../d
./c.2
-d
-exec
-execdir
rename -d
최종 메모
문제의 명령에는 -depth
및 가 포함됩니다 rename -d
. OP에는 다음과 같이 명확하게 명시되어 있습니다.
-depth
나중에 옵션을 추가했습니다 [... ]
어쩌면 부족함 -depth
이 원래 문제일 수도 있습니다. 하지만:
[추가
-detph
] 도움이 되지 않음
이 점을 고려하고 오류( Can't rename …
)가 에서 발생한다는 점을 고려하여 오류( ) 가 항상 존재하는 것은 아니거나 뭔가 빠졌다는 rename
결론을 내렸습니다 . 이제는 with가 강력해야 한다고 -d
생각합니다 . OP가 실제로 실패했다고 가정하면 아직 설명할 수 없습니다.find -depth
rename -d