디렉터리와 해당 내용을 반복적으로 삭제한 다음 동일한 이름과 권한으로 다시 만들고 싶습니다. 디렉토리는 삭제되기 전에 내가 생성하거나 소유했을 수도 있고 그렇지 않았을 수도 있지만 Root가 생성한 폴더는 건드리지 않고 나와 같은 수준의 사용자가 생성/소유한 폴더만 건드릴 것이라고 확신합니다.
디렉터리와 그 내용을 모두 재귀적으로 삭제하는 명령이 있습니다.
rm -rf path/to/somefolder 2> /dev/null
## OR ##
rm -rf /some/path/.* 2> /dev/null && rm -rf /some/path 2> /dev/null
그런데 삭제하기 전에 권한을 얻은 다음 새로 생성된 디렉터리에 다시 적용하려면 어떻게 해야 합니까?
답변1
사용하기 쉽습니다mtree
.
a/
현재 디렉토리를 루트로 하는 경로가 주어지면:
235158 1 drwx------ 3 jim wheel 4 Apr 1 08:08 .
235199 1 drwxr-xr-x 3 jim wheel 3 Apr 1 08:05 ./a
234526 1 drwxr-xr-x 3 jim wheel 3 Apr 1 08:05 ./a/b
234527 1 drwxrwxr-x 3 jim wheel 3 Apr 1 08:05 ./a/b/c
234528 1 drwx------ 2 jim wheel 2 Apr 1 08:05 ./a/b/c/d
Create Hierarchy 사양을 사용하여 시작하세요 mtree
. -d
디렉토리만 처리됨을 나타내고 -c
사양을 생성하여 표준 출력에 기록하는 플래그이며 -p a
mtree에게 계층 구조의 루트 디렉토리를 알려줍니다.
$ mtree -dcp a > a.mtree
다음으로 계층 구조를 삭제 a
하고 빈 디렉터리를 다시 만듭니다 a
.
$ rm -rf a
$ mkdir a
마지막으로 아래 디렉터리 계층 구조를 다시 채우고 a
생성된 초기 사양에 문서화된 값으로 모든 권한을 설정합니다 mtree
. 여기서는 플래그를 생략하겠습니다. -c
왜냐하면 우리는 그렇지 않기 때문입니다.만들다사양은 표준 입력에서 읽고 디스크의 실제 계층 구조와 비교합니다. -t
계층 구조 내의 타임스탬프를 사양의 값으로 설정하기 위해 추가되었습니다.
$ mtree -utp a < a.mtree
.: modification time (Mon Apr 1 08:05:24 2024, Mon Apr 1 08:11:33 2024, modified)
b: modification time (Mon Apr 1 08:05:24 2024, Mon Apr 1 08:11:33 2024, modified)
b/c: modification time (Mon Apr 1 08:05:24 2024, Mon Apr 1 08:11:33 2024, modified)
b/c/d: modification time (Mon Apr 1 08:05:24 2024, Mon Apr 1 08:11:33 2024, modified)
$ find a -ls
235555 1 drwxr-xr-x 3 jim wheel 3 Apr 1 08:05 a
194841 1 drwxr-xr-x 3 jim wheel 3 Apr 1 08:05 a/b
194842 1 drwxrwxr-x 3 jim wheel 3 Apr 1 08:05 a/b/c
194843 1 drwx------ 2 jim wheel 2 Apr 1 08:05 a/b/c/d
쓰기 액세스 권한이 있지만 a/
루트에 대한 상위 디렉터리가 없는 경우 대신 아래에 디렉터리를 만들 a/
수 있습니다 . 그렇지 않으면 비슷한 방식으로 계속 진행하세요.a.mtree
/tmp
$ mtree -dcp a > /tmp/a.mtree
$ rm -rf a
rm: a: Permission denied
오류 메시지에도 불구하고 a/
자체를 제외한 모든 것이 사라졌습니다.
$ find a
a
따라서 쓰기 권한이 없는 경우 계속을 a/..
건너뛸 수 있습니다 mkdir a
.
$ mtree -utp a < /tmp/a.mtree
.: modification time (Mon Apr 1 08:05:24 2024, Mon Apr 1 08:11:33 2024, modified)
b: modification time (Mon Apr 1 08:05:24 2024, Mon Apr 1 08:11:33 2024, modified)
b/c: modification time (Mon Apr 1 08:05:24 2024, Mon Apr 1 08:11:33 2024, modified)
b/c/d: modification time (Mon Apr 1 08:05:24 2024, Mon Apr 1 08:11:33 2024, modified)
답변2
디렉터리를 삭제하고 다시 만드는 대신 내용을 삭제하고 현재 비어 있는 디렉터리를 그대로 두는 것이 좋습니다. 이는 상위 디렉터리에 쓸 수 없을 때 작동하는 장점이 있습니다.
또는 새 디렉터리를 만듭니다.앞으로chmod --reference=
예를 들어 coreutils 등을 사용하여 권한(및 타임스탬프까지)을 복사할 수 있도록 이전 항목을 제거하세요. 이전 디렉터리를 삭제한 후 새 디렉터리의 이름을 변경하는 데 사용됩니다 mv
(또는 새 디렉터리를 생성하기 전에 이전 디렉터리의 이름을 변경).