파일을 삭제할 때 특정 파일 및 디렉토리 제외


11

내 최상위 디렉토리는 data입니다. data여러 디렉토리를 포함하며이 디렉토리에는 하위 디렉토리가 있습니다. data/일부 디렉토리의 여러 파일을 제외하고 내부의 모든 파일과 디렉토리를 제거해야합니다 .

예를 들어, 데이터에는 디렉토리 100와가 포함됩니다 101. 난 그냥 유지하려는 a.txtb.txt에있는 파일 100/c.txtd.txt에있는 파일 101/의 다른 모든 파일과 디렉토리를 제거하는 동안 100101.

예:

.
├── 100
   ├── a.txt
   ├── b.txt
   ├── c.txt
   └── d.txt
└── 101
    ├── a.txt
    ├── b.txt
    ├── c.txt
    └── d.txt

rm -rf !(a.txt|b.txt)명령을 사용 하지만 각 디렉토리에이 명령을 자동으로 적용 할 수 없습니다.

답변:


12

이미 알았 듯이 다음 extglob기능을 사용하는 기능을 사용할 수 있습니다.

shopt -s extglob

그러면 다음과 같은 작업을 수행 할 수 있도록 일치 항목을 제외 할 수 있습니다.

rm 100/!([ab].txt) 101/!([cd].txt)

echo먼저 테스트 해 보는 것이 좋습니다 . 이 예는 아무것도 내부 일치 100/하지 않습니다 a.txt또는 b.txt아무것도의 내부 101/되지 않습니다 c.txt또는 d.txt. 동일한 규칙이 100/적용되는 경우 다음과 102/같이 할 수 있습니다.

10[02]/!([ab].txt) # or
{100,102}/!([ab].txt)

방금 100 및 101 디렉토리에 대한 예제를 제공했지만 실제로는 서브 디렉토리의 수가 거의 20입니다. 각 디렉토리 이름을 기본 폴더에 쓰지 않고 각 디렉토리에 대해 위의 코드를 구현하는 방법이 있습니까?
deepblue

@deepblue 귀하의 질문에 대한 정확한 예를 제시하십시오 ( edit ), 그것을 rm지정하지 않으려는 경우 어떤 디렉토리에 어떤 파일을 보관 해야하는지 알아야합니다.
디저트

7

find이것을 위해 사용할 수 있습니다 . 당신은에서 테스트를 부정 할 수 find-not!. 일치하는 것을 찾는 것이 아니라 제외시킵니다.

보관하려는 파일의 상위 디렉토리, 특히 현재 디렉토리 를 삭제하지 않도록주의해야합니다 .. 따라서 삭제하기 전에 출력을 철저히 읽으십시오.

예제를 기반으로 data디렉토리 에서 이와 같은 작업을 수행 할 수 있습니다.

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt"

! -path ./path/to/dir삭제하지 않으려는 경로 에 대해를 추가하십시오 . 와 같은 메타 문자를 사용할 수 *있지만 "./path*dir"원치 않는 확장을 방지하기 위해 예를 들어 식을 인용해야합니다 .

find기본적으로 재귀입니다. ./100여기서 찾을 수 없더라도 패턴과 일치하지 않으면 모든 내용을 찾을 수 [ab].txt있습니다. 유지하려는 모든 이름과 일치하지 않으면 다른 테스트를 추가하십시오.

! -path "./100/[ab].txt" ! -path ./100/foo

이것은 a.txt또는 b.txt또는 찾지 foo못하지만 다른 모든 파일을 찾습니다.

원하는 내용이 확실하면 -delete끝에 추가 하여 찾은 파일을 삭제할 수 있습니다.

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt" -delete
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.