많은 파일을 포함하는 디렉토리가 있습니다. file.txt를 제외한 모든 파일을 삭제하고 싶습니다. 어떻게해야합니까?
원하지 않는 파일을 개별적으로 제거하기에는 파일이 너무 많으며 이름이 너무 다양하여 *를 사용하여이 파일을 제외한 모든 파일을 제거 할 수 없습니다.
누군가 사용 제안
rm !(file.txt)
그러나 작동하지 않습니다. 다음을 반환합니다.
Badly placed ()'s
내 OS는 Scientific Linux 6입니다.
어떤 아이디어?
답변
POSIXly :
find . ! -name 'file.txt' -type f -exec rm -f {} +
를 제외한 모든 일반 파일 (숨겨진 파일을 포함하여 재귀 적으로)을 제거합니다 file.txt
. 디렉토리를 제거하려면, 변경 -type f
에 -type d
와 추가 -r
로 옵션을 rm
.
에서 bash
사용하려면 rm -- !(file.txt)
다음을 수행해야 extglob 가능 :
$ shopt -s extglob
$ rm -- !(file.txt)
(또는 전화 bash -O extglob
)
참고 extglob
에서만 작동 bash
및 Korn 쉘의 가족. 사용 rm -- !(file.txt)
하면 Argument list too long
오류 가 발생할 수 있습니다 .
에서 확장 글로브가 활성화 된 패턴을 무효화 zsh
하는 ^
데 사용할 수 있습니다 .
$ setopt extendedglob
$ rm -- ^file.txt
또는와 같은 구문을 사용 ksh
하고 bash
옵션 ksh_glob
및 no_bare_glob_qual
사용 가능.
답변
다른 방향으로 다른 방향 (파일 이름에 공백이없는 경우)
ls | grep -v file.txt | xargs rm
또는 (파일 이름에 공백이 있어도 작동합니다)
ls | grep -v file.txt | parallel rm
부터 man grep
:
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX)
답변
사본을 유지 보수하고 모든 항목을 삭제하며 사본을 복원하십시오.
{ rm -rf *
tar -x
} <<TAR
$(tar -c $one_file)
TAR
한 줄로 :
{ rm -rf *; tar -x; } <<< $(tar -c $one_file)
그러나 여기에는 문자열을 지원하는 쉘이 필요합니다.
답변
당신은 모두 이것을 너무 생각하고 있습니다.
cd ..
mv fulldir/file.txt /tmp/
rm -rf fulldir
mkdir fulldir
mv /tmp/file.txt fulldir/
끝난.
실제로 더 쉽게 편집하십시오 .
cd ..
ln fulldir/file.txt ./
rm -rf fulldir
mkdir -p fulldir
mv file.txt fulldir/
답변
내 Scientific Linux 6 OS에서는 다음과 같이 작동합니다.
shopt -s extglob
rm !(file.txt)
또한 가상 머신에 데비안 32 비트가 설치되어 있습니다. 위의 기능은 작동하지 않지만 다음은 작동합니다.
find . -type f ! -name 'file.txt' -delete
답변
rm !("file.txt")
대신에 사용rm !(file.txt)
답변
다른 답변을 제공하기 위해 rm
폴더를 삭제하지 않는 기본 동작을 사용할 수 있습니다 .
mkdir tmp && mv file.txt tmp # create tmp dir and move files there
rm # delete all other files
mv tmp/* . && rm -rf tmp # move all files back and delete tmp dir