`ls` 명령에서 폴더 접두사를 제거 할 수 있습니까


12

나는 bash 스크립트에 있고 모든 파일 목록을 얻고 싶습니다 (모든 jar 파일을 말하십시오). 명령을 실행하고 ls -1 lib/*.jar출력을 얻습니다.

lib/mylib_1.jar
lib/mylib_2.jar
...

다음과 같은 출력 옵션이 있습니까?

mylib_1.jar
mylib_2.jar
...

cd lib루프하기 전에 미리 만들기 는 옵션이 아니며 루프 내에서 수행하려는 작업을 수행하려면 상위 폴더에 있어야합니다.

입력하여 정보를 찾으려고 man ls했지만 해결책을 찾지 못했습니다.

다른 명령을 사용하는 솔루션은 명령에 ls충분하거나 자체적으로 파이프 할 수 있다면 좋을 것 입니다.


해당 파일 이름으로 무엇을하고 있습니까? 그것들을 터미널에 방금 나열 했습니까, 아니면 다른 프로그램이나 스크립트 (개인 또는 목록)로 전달하고 있습니까? 이를 처리하는 올바른 방법은 파일 이름 사용 방법에 따라 다릅니다.
Kusalananda

아이디어는 다중 모듈 Java 프로젝트에서 타사 라이브러리에 대한 통계를 수행하는 것이 었습니다. 난 그냥 목록을 원했고 정렬하고 uniq 후
рüффп

답변:


19

대신에 LS를 분석 하면 사용해야합니다 find대신. 그런 다음 basename각 파일에서 실행 하여 주요 디렉토리를 제거 할 수 있습니다 .

find lib/ -name '*.jar' -exec basename {} \;

이 방법은 나에게도 완벽합니다.
рüффп

3
-maxdepth옵션 도 참조하십시오 .

13

GNU를 사용하면 모든 단일 파일에 대해 find실행할 필요가 없으므로 basename훨씬 빠릅니다 (특히 많은 파일이있는 경우).

find lib -name '*.jar' -printf '%P\n'

11

(cd lib && echo *.jar)파일 이름에 공백이나 특수 문자가 없다고 가정하면 어떻습니까 ? 부모 스크립트는 디렉토리를 변경하지 않습니다.


공백도 문제가되지 않습니다.
terdon

이것은 좋은 생각이며 아마도 가장 빠른 옵션 일 것입니다. 그래도 printf '%s\n' *.jar각 파일을 다른 줄에 넣습니다.
Graeme

또는 printf '%s\0' *.jar공백 문제를 제거하기 위해 (Q가 아니지만).
Graeme

5

Josh Jolly가 그의 대답에서 말했듯이 구문 분석해서는 안됩니다 ls. 대신 그의 대답에 접근 방식을 사용하십시오. 여전히 awk파일 이름에서 경로를 제거 하는 해결책이 있습니다. ls와 함께 사용하지 마십시오.

find . | awk -F'/' '{print $NF}'

-F'/'세트 필드 세퍼레이터로 /하는 마지막 필드는 것을 의미 $NF파일 이름 일 것이다.


1

find가는 방법은 아마,하지만 당신이 경우 정말로, 정말로 (그렇지) 벗겨하려는 lib/에서 ls -1, 당신은 사용할 수 있습니다 sed:

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

0

--max-args (또는 더 짧은 alias -n) 매개 변수와 함께 xargs 를 사용하여이를 수행 할 수 있습니다 .

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

--quoting-style=c파일 이름의 공백이 xargs를 망치지 않도록하기 위해 사용 합니다.


나는 그것을 알아 차리지 못했다. 감사합니다! 다른 스택 교환에서이 gem을 찾았습니다. --quoting-style = c를 사용하여 ls 결과에 따옴표를 도입 할 수 있습니다. 결과 전체 명령은 다음과 같습니다.`ls --quoting-style = c -1 lib / *. jar | xargs --max-args 1 기본 이름`
yoni

-1

쿼리를 해결하는 다른 방법은을 사용하여 모든 파일을 나열하는 것 ls -R입니다. ls 명령의 출력을 grep과 결합하여 .jar 파일 만 나열하십시오. 다음 명령을 사용하여 쿼리에 대해 동일한 작업을 수행 할 수 있습니다.

ls -R lib | grep jar| grep -v jar*

jar 파일을 포함하는 서브 디렉토리 또는 "list-of-jars.txt"와 같은 파일이있는 경우 이는 실패합니다.
Jules

grep -v jar *는 인용 된 예제와 같은 이름의 파일로 결과를 필터링합니다.
joshi.mohit86

진실. 또한 의도 한 모든 파일을 필터링합니다. 이제 다시 한 번 살펴보면, 제안한 명령이 실제로 출력을 생성하는 상황은 전혀 없습니다.
Jules

아니요, 같은 파일을 표시 mylib_2.jar하고 같은 파일 을 필터링합니다 list-of-jars.txt.
joshi.mohit86

아닙니다. 방금 시도했습니다. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> 전혀 출력이 없습니다.
Jules
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.