csv 파일을 제외한 폴더의 모든 항목을 삭제하고 싶습니다.
Bash 스크립트를 사용하려고 하는데 다음 오류가 발생합니다.
syntax error near unexpected token `('
이것은 내 스크립트입니다.
PATH=/tmp/
run_spark_local
rm -v !($PATH*.csv)
cp -r $PATH /data/logs/
나도 시도했다
rm -v !("$PATH*.csv")
답변1
$PATH를 설정하지 마십시오. 환경 변수입니다.
BASH의 경우외부 전역 변수셸 옵션을 활성화하면(많은 Linux 배포판의 기본값) 다음과 같습니다.
rm !(*.csv)
폴더 경로를 사용하면 다음과 같습니다.
rm yourfolder/!(*.csv)
귀하의 환경에서 extglob이 활성화되어 있지 않다고 생각되면 다음을 수행하십시오.
shopt -s extglob
답변2
이 변수를 설정하지 않아야 합니다 PATH
. 이는 쉘에서 유효한 명령을 찾는 데 사용되며, 이를 설정하면 스크립트가 명령을 /tmp/
완전히 찾지 못하게 됩니다 .rm
cp
find
다음 명령을 사용하여 원하는 것을 달성 할 수 있습니다 .
find /tmp -not -name '*.csv' -not -path /tmp -exec rm -vr {} \;
참고: 이렇게 하면 /tmp 아래의 모든 하위 디렉터리도 삭제됩니다. 이를 원하지 않으면 다음과 같이 변경해야 합니다.
find /tmp -not -name '*.csv' -type f -exec rm -v {} \;
또한 참고: 이는 여전히 하위 디렉터리로 재귀되며 그 안에 있는 파일을 삭제합니다. 이를 원하지 않으면 다음 maxdepth
매개변수를 사용할 수 있습니다.
find /tmp -not -name '*.csv' -maxdepth 1 -type f -exec rm -v {} \;
find ... -exec
추가 참고 사항: 나는 온라인에서 찾은 명령이 필요한 작업을 수행하는지 먼저 확인하지 않고는 절대 실행하지 않을 것입니다 . 다음을 실행해야 합니다:
find /tmp -not -name '*.csv' -not -path /tmp
그리고 해당 비트를 추가하기 전에 원하는 파일만 찾는지 확인하십시오 -exec rm -vr {} \;
.
답변3
/tmp
관심 있는 파일만 복사하고 나머지 파일은 삭제하지 않는 것이 좋습니다.
cp /tmp/*.csv /data/logs/
심지어
mv /tmp/*.csv /data/logs/
보관할 필요가 없다면 /tmp
.
이는 관심 있는 모든 파일이 직접 위치에 있다고 가정 합니다 /tmp
.rm
/tmp
공유 임시 디렉터리이기 때문에 실행 중인 다른 프로세스가 그곳에서 찾을 것으로 예상하는 다른 파일이 포함될 수 있으며, /tmp
CSV 파일을 제외한 모든 항목을 삭제하면 바람직하지 않은 결과가 발생할 수 있습니다. 다른 사람들이 언급했듯이, PATH
쉘은 이를 사용하여 사용 중인 명령을 찾기 때문에 이를 변경해서는 안 됩니다 .