2013-02-06 3 views
2

리눅스에서 아주 간단한 스크립트를 작성하려고합니다. 내가 bash myscript 명령에이 코드를 실행하면리눅스 배시 스크립트 : 경로없이 파일을 얻는 방법?

#!/bin/bash 
# The shell program uses glob constructs and ls 
# to list all entries in testfiles, that have 2 
# or more dots "." in their name. 

ls -l /path/to/file/*.*.* 

가, 내가 좋아하는 뭔가를 얻을 :
내가 당신에게 먼저 코드를 보여주지 /path/to/file/file.with.three.dots을

그러나 나는 이것을 원하지 않는다. 경로가 아닌 파일 이름 만 표시하려고합니다. 내가/파일 /에 /은/경로의 내부입니다 만, 나에게 파일을 보여줍니다

ls -l *.*.* 

그러나이 시간은 다음과 같습니다
그럼 난 노력했다.
어떤 경로에서 스크립트를 실행할 때/path/to/file /에 파일의 이름을 출력 할 수 있습니까?

감사합니다.

(cd /path/to/file; ls -l *.*.*) 
+0

'p = $ (realpath foo/bar) '와 같은'realpath' 명령을 사용할 수도 있습니다. –

+0

편집 됨; 귀하의 질문 제목은 당신이 알고 싶은 것과 정반대의 질문이었습니다. –

답변

7

basename path/to/file.b.c

이 가 가

그러나 다시 읽고 질문에, 나는 경로에 임시 cd을 생각하고 다음 ls이 더있을 수 있습니다 file.bc 제공해야

ls -l /path/to/file/*.*.* | awk -F '/' '{print $NF}' 

이제 설명 : 선택한 파일을 나열한 다음 awk를 사용합니다. 스위치 -F는 분할에 사용할 문자를 결정합니다 (이 경우 /). 그런 다음 awk을 사용하여 "$ NF"값을 인쇄합니다. "$ NF"는 "마지막 것"을 의미합니다. 그래서 당신은 /path/to/file/file.with.three.dots를 가지고 있습니다. 파일 시스템을 분할하고 파일 시스템의 현재 위치를 변경할 필요없이 마지막 파일 (file.with.three.dots)을 가져 와서 인쇄하십시오 (경로의 길이에 관계없이).

정말 도움이 되었으면합니다.

+0

그래서'ls -l basename/path/to/file /*.*.*'라고 써주시겠습니까? –

+1

기본 이름 명령은 경로의 파일 이름 만 제공합니다. (cd/path/to/file; ls -l *. *. *)' – John3136

+0

이제'cd/path/to/file /; ls -l *. *. *'./path/to/파일 내부에서 'bash myscript'를 실행하는 경우에만 예상대로 작동합니다. –

2

코드 첫째 :

0

나는 basename을 고집하는 것이 좋습니다.

ls -1 /path/to/file/*.*.* | while read path 
do 
    basename "$path" 
done 

최선을

동안은 $에 경로를보다는 을 읽을 사용하는 (LS/경로/) * 만 경로가 루프 의지 세그먼트의 경로에 대한 그들에게에 공백이 일어날 경우 때문이다.

+0

사실, for 루프를 사용하는 것이 가장 좋습니다 :'for path in /path/to/file/*.*.* ;; do ... ... ' –

+0

glob 패턴에 공백이 있으면 for 루프가 중단됩니다. – zapatero

+0

그것은 for 루프를 사용하여 glob 패턴을 반복하는 마법입니다. '$ (ls)'에'for file '을했다면, 공백으로 쪼개 질 것입니다. –

0

환경 변수에서 기본 파일 이름을 캡처하기 위해 Zapatero의 기술에 변형을 사용했습니다. $1은 내 스크립트의 정의에 따라 해당 파일 이름의 전체 경로 인 명령 줄 인수입니다.

전체 경로에 와일드 카드가 포함되어 있고 여러 결과가 반환되는 경우 basename 변수는 일치하는 마지막 파일 이름 (임의의 숫자로 ls이 반환 됨)으로 설정됩니다.

basename=$(ls -1 "$1" | while read path; do basename "$path"; done) 
1

또는 find 명령을 사용하십시오.

$> find /path/to/file -printf %f\\n\\r 
관련 문제