cat 출력을 rm에 제공

cat 출력을 rm에 제공

다른 디렉토리에서 삭제해야 하는 파일에 파일 이름이 있습니다.

dir 에 x및 파일이 있다고 가정해 보겠습니다 . cat을 사용하여 어떻게 삭제하나요?ya

나는 노력했다.

rm -f a/{`cat a.txt`}

a.txt내용이 있습니다 x,y,z.

같은 폴더에 있으면 넣어서 실행할 수 x y z있습니다 a.txt.

rm -f `cat a.txt`

잘 작동합니다.

나도 시도해 봤는데,

rm -f "a/{"`cat a.txt`"}"

이 명령은 dockerfile에 저장되므로 변수도 사용하지 않는 것이 좋습니다.

하지 마라파일만 포함하도록 a/x a/y a/z고정되어 있으므로 옵션이 될 수 있는 파일을 넣으 려고 합니다 . a하지만 adockerfile에서만 변경해야 합니다. 모든 제안에 미리 감사드립니다 :)

답변1

while 루프를 사용하여 파일을 한 줄씩 읽은 다음 각 줄을 rm. 이는 스크립팅에서 매우 일반적이고 자주 사용되는 접근 방식입니다.

while IFS= read -r line
do
       rm a/"$line"
done < file.txt

당연히 파일 형식은 한 줄에 하나의 파일이 있는 파일 목록이어야 합니다.

답변2

이런 종류의 용도로 사용하지 마십시오 $(cat file). 예를 들어 파일 이름에 공백이 있으면 깨질 것입니다.

$ cat a.txt 
foo
bar baz
bam

그리고

$ ls -Q a
"bam"  "bar baz"  "foo"  "other file"  "somefile"

그 다음에

$ (cd a ; rm $(cat ../a.txt))
rm: cannot remove 'bar': No such file or directory
rm: cannot remove 'baz': No such file or directory

대신에 다음을 사용할 수 있습니다.xargs

$ ls -Q a
"bam"  "bar baz"  "foo"  "other file"  "somefile"
$ xargs -a a.txt -I{} rm a/{}
$ ls -Q a
"other file"  "somefile"

만약 너라면정말을 사용하고 싶다면 cat다음과 결합하세요 xargs:

cat a.txt | xargs -I{} rm a/{}

( -a기능이 제공되기는 하지만고양이의 쓸모없는 사용)


ie는 입력 파일의 각 라인에 대해 한 번씩 호출된다는 것을 -I{}의미합니다 . 디렉토리 경로를 앞에 추가할 필요가 없는 경우 에 여러 인수를 전달하는 를 없애면 명령을 더 효율적으로 만들 수 있습니다 . 그러나 이 경우 공백이 깨지는 것을 방지하기 위해 입력 구분 기호를 명시적으로 개행 문자로 설정해야 합니다 .-L 1rm-Ixargsrmxargs -a a.txt -d '\n' rm

답변3

파일 이름에 공백이나 특수 문자가 포함되어 있지 않다고 가정하면 cd앞에 a를 사용하여 원래 명령을 다시 사용하세요.

(cd a; rm -f $(cat a.txt))

파일 이름에 공백이나 특수 문자가 있으면 쉽게 깨지 므로 NUL로 구분된 파일 이름을 rm -f `cat a.txt`사용해야 합니다 .xargs

관련 정보