2013-02-06 48 views
2

我想在Linux中編寫一個非常非常簡單的腳本。
讓我告訴你的代碼第一:Linux Bash腳本:如何獲取沒有路徑的文件?

#!/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/*.*.* 

當我運行此代碼bash myscript命令,我得到的是這樣的:/path/to/file/file.with.three.dots

但我不想要這個。我只想顯示文件名稱,而不是路徑。
然後我嘗試:

ls -l *.*.* 

但這次是顯示我的文件,只有當我的/路徑內/到/文件/。
如何設置路徑,所以當從任何地方運行腳本時,它將輸出/ path/to/file /中的文件名稱?

謝謝!

+0

您可能希望使用'realpath'命令,例如'p = $(realpath foo/bar)' –

+0

已編輯;你的問題的題目與你想知道的完全相反。 –

回答

7

basename path/to/file.b.c應該給你file.bc

但是重新閱讀的問題,我覺得暫時cd的路徑,然後一個ls可能會更好:第一

(cd /path/to/file; ls -l *.*.*) 
+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

代碼:

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

現在的解釋:你列出你選擇的文件,然後在其上使用awk。開關-F將確定你用於分割的字符(在這種情況下爲/)。然後你用awk打印「$ NF」的值,這意味着「最後一個」。所以你有:/path/to/file/file.with.three.dots。拆分它,取最後一個(file.with.three.dots)並打印出來(無論你的路徑有多長/多深),並且不需要改變你在文件系統上的當前位置。

我真的希望,我已經幫助過了。

0

我建議堅持basename。

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

它最好使用而在$讀取而非的路徑(LS /路/)*只因爲如果你的路徑碰巧有for循環將會段道路在他們的空間。

+0

其實,最好使用for循環:'for /path/to/file/*.*.* .; do ...' –

+0

但是如果glob模式在其中有空格,for循環將會中斷。 – zapatero

+0

它不會:這是使用for循環遍歷glob模式的神奇之處。如果你使用$(ls)'作爲文件,那*會*在空格上斷開。 –

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 
相關問題