
다음 명령은 재생 중인 노래의 경로를 인쇄합니다.
mpc | head -n 1
songs/oldSongs/Mukesh_D/041 KANHAIYA = YAAD AAYI ADHI RAAT KO.mp3
파일을 인쇄하는 명령을 수정하여 파일을 삭제할 수 있습니까?
답변1
보다 일반적인 질문에 대답하려면 xargs
표준 입력의 단어 목록을 가져와 명령의 인수 목록으로 변환해야 합니다.
그러나 xargs
목록은 작은 따옴표, 큰 따옴표 및 백슬래시를 사용하여 이스케이프된 공백, 탭 및 줄 바꿈(로케일 및 xargs 구현에 따라 더 많은 공백 문자 가능)으로 구분된 단어 목록으로 예상됩니다. xargs의 다른 구현을 통해 중첩된다는 점에서 동작).
입력이 개행으로 끝나는 목록인 경우규범적 접근이것을 xargs로 변환합니다. 예상되는 형식은 모든 문자를 이스케이프하는 것입니다(백슬래시, 작은따옴표, 큰따옴표, 밑줄(아마도), 공백 및 탭만 필요하지만(C 로캘이 아닌 경우 다른 공백도 필요할 수 있음)) 백슬래시 문자 개행 문자에는 sed
.
mpc | head -n 1 | sed 's/./\\&/g' | xargs rm --
일부 xargs
구현에서는 표준 입력에서 예상되는 최대 행 길이에 대한 제한이 다소 낮으므로 이를 사용하여 필요한 문자만 이스케이프할 수 있습니다.
최소한 GNU에서는 xargs
이렇게 할 필요가 없습니다. 다음과 같이 하면 됩니다.
mpc | head -n 1 | xargs -rd '\n' rm --
(또한 입력이 비어 있을 때 명령 실행을 방지하려면 GNU 관련 -r 옵션을 사용하십시오.)
답변2
를 사용하여 이 작업을 수행할 수 있습니다 rm -i "/path/to/music/library/$(mpc -f %file% | head -n 1)"
. 그러나 파일 이름에 개행 문자가 포함되어 있으면 이것이 중단된다는 점에 유의하십시오. 의 출력은 mpc -f %file%
음악 라이브러리 경로에 상대적이므로 출력 전에 추가해야 합니다.
답변3
개인적으로 xargs가 흥미롭다고 생각하지만 루핑 기능을 더 선호합니다. 왜? 글쎄, 그것은 더 많은 유연성을 제공하고 공간을 처리하는 매우 간단한 방법도 제공합니다.
mpc | head -n 1 | while read filename
do
ls -al "$filename" # Look at the file you're deleting
rm -i "$filename" # Ask if you want it deleted (or not)
done
이와 같이 while 루프를 사용하면 변수를 참조하기 위해 "read" 뒤에 오는 변수 이름에 데이터가 주입됩니다. 앞에 달러 기호가 필요합니다. 따옴표는 공백을 우아하게 처리하기 위해 존재하므로 구분 기호처럼 보이지 않습니다. 이와 같은 루프는 단순한 단일 선만큼 우아하지는 않지만 더 많은 유연성을 제공하므로 장기적으로 매우 편리할 수 있습니다.
답변4
큰따옴표나 개행 문자가 포함된 파일이 없다고 가정하는 것이 안전하다면 다음을 수행할 수 있습니다.
mpc | head -n 1 | sed 's/^/"/g ; s/$/"/g' | xargs rm --
sed는 파일 이름 주위에 따옴표를 추가하고 xargs는 얻은 입력을 실행 중인 명령(이 경우 rm 명령)에 대한 인수로 변환합니다.