
다른 디렉토리에서 삭제해야 하는 파일에 파일 이름이 있습니다.
dir 에 x
및 파일이 있다고 가정해 보겠습니다 . cat을 사용하여 어떻게 삭제하나요?y
a
나는 노력했다.
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
하지만 a
dockerfile에서만 변경해야 합니다. 모든 제안에 미리 감사드립니다 :)
답변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 1
rm
-I
xargs
rm
xargs -a a.txt -d '\n' rm
답변3
파일 이름에 공백이나 특수 문자가 포함되어 있지 않다고 가정하면 cd
앞에 a를 사용하여 원래 명령을 다시 사용하세요.
(cd a; rm -f $(cat a.txt))
파일 이름에 공백이나 특수 문자가 있으면 쉽게 깨지 므로 NUL로 구분된 파일 이름을 rm -f `cat a.txt`
사용해야 합니다 .xargs