디렉토리 B와 D를 제거하고 싶지만 C와 모든 하위 파일과 디렉토리를 유지하고 싶습니다. 하나의 디렉토리와 그 하위를 제외한 상위 디렉토리의 모든 하위 디렉토리를 제거하는 명령은 무엇입니까?
감사합니다.
A
어떻습니까? 그것들을 삭제하거나 보관 하시겠습니까?
디렉토리 B와 D를 제거하고 싶지만 C와 모든 하위 파일과 디렉토리를 유지하고 싶습니다. 하나의 디렉토리와 그 하위를 제외한 상위 디렉토리의 모든 하위 디렉토리를 제거하는 명령은 무엇입니까?
감사합니다.
A
어떻습니까? 그것들을 삭제하거나 보관 하시겠습니까?
답변:
원하는 것은이 명령입니다.
find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
# List what's inside directory we want to remove
$ ls
file1 file2 keepMe/ removeA/ removeB/
# Testing what find gives without removing
$ find ~/TESTDIR -mindepth 1 -type d -not \( -name "keepMe" \)
/home/xieerqi/TESTDIR/removeA
/home/xieerqi/TESTDIR/removeB
# Actual removal and testls
$ find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
$ ls
file1 file2 keepMe/
find DIRECTORY
DIRECTORY에서 작동하는 find 명령을 호출하십시오.-mindepth 1
: 디렉토리의 내용으로 만 작업하고 레벨 0 인 디렉토리 자체는 피하십시오.-maxdepth 1
: 하위 디렉토리로 내려가는 것을 방지합니다 ( rm -rf
어쨌든 재귀 적이므로 하위 디렉토리로 내려갈 필요가 없습니다)-type d
: 디렉토리 만 검색-not \( -name "keepMe" \)
유지하려는 이름의 항목을 무시하십시오.-exec rm -rf {} \;
발견 된 각 항목에서 제거를 수행find
여기 좋은 친구이지만 Bash for
와 test
더 좋은 친구입니다 ...>
bash 쉘의 확장 글롭 기능 사용 (현재 우분투 설치에서 기본적으로 활성화 됨)
$ tree A
A
├── B
├── C
│ ├── ac1
│ └── ac2
└── D
5 directories, 0 files
당신은을 제외한 모든 것을 해결할 수 C
와 그 내용물 글로브 표현의 사용 A/!(C)
예를
$ echo A/!(C)
A/B A/D
따라서 디렉토리 와 그 내용을 제외한 모든 것을 제거C
하려면 간단히 사용할 수 있습니다
rm -rf A/!(C)
퇴거
$ tree A
A
└── C
├── ac1
└── ac2
3 directories, 0 files
('"
원격으로 실행할 때 예기치 않은 토큰 근처에 구문 오류가 발생합니다 ssh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)"
. 어떤 아이디어라도 감사합니다.
extglob
쉘 옵션은 대화식 쉘에서만 사용할 수 있습니다. 강제 ssh
로 할 수 있는지 확실하지 않습니다
하나의 쉬운 방법은 휴지통을 사용하는 것입니다
당신은 그것을 설치할 수 있습니다 sudo apt-get install trash-cli
일단 설치되면 부모 디렉토리 A로 이동 cd /A
한 다음 trash B D
B와 D가 제거하려는 디렉토리 인 명령을 발행
할 수 있습니다 (실제로 드라이브에 대한 휴지통에서 결국 실수를 할 수 있습니다) 파일을 복구)
우분투 16.04 및 14.04에서 테스트
trash ! C
있습니까?
trash: cannot trash non existent
! '`
extglob
그래도 활성화해야합니다 .
Bash의 for
루프를 사용 test
하고 원하는 디렉토리를 필터링하고 다음과 rm -rf
같이 디렉토리를 재귀 적으로 삭제 하는 명령을 필터링하십시오 .
for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done
내부의 모든 요소 (파일 및 디렉토리)를 /path/to/parent/
반복하고 이름이 같지 않으면 요소를 재귀 적으로 삭제합니다 dir_survive
. 상위 디렉토리가 현재 디렉토리 인 경우 *
경로 로만 쓸 수 있습니다 .
확실하지 않고 어떤 조치를 취하지 않고 먼저 삭제 될 요소를 테스트하려는 경우 rm -rf
위의 명령 echo
에서를 바꾸면 삭제 후보 만 출력됩니다.
다음은 예제 실행입니다.
$ tree
.
├── dir1
│ ├── subdir1
│ │ ├── file1
│ │ └── file2
│ └── subdir2
│ ├── file1
│ └── file2
├── dir2
│ ├── subdir1
│ │ ├── file1
│ │ └── file2
│ └── subdir2
│ ├── file1
│ └── file2
└── dir_survive
├── subdir1
│ ├── file1
│ └── file2
└── subdir2
├── file1
└── file2
9 directories, 12 files
$ for x in *; do test "$x" != "dir_survive" && rm -rf "$x"; done
$ tree
.
└── dir_survive
├── subdir1
│ ├── file1
│ └── file2
└── subdir2
├── file1
└── file2
3 directories, 4 files