web-dev-qa-db-ja.com

ディレクトリパス全体なしでファイル名のみを表示するには

ls /home/user/new/*.txtは、そのディレクトリ内のすべてのtxtファイルを印刷します。ただし、次のように出力を印刷します。

[me@comp]$ ls /home/user/new/*.txt
/home/user/new/file1.txt    /home/user/new/file2.txt    /home/user/new/file3.txt

等々。

/home/user/new/ディレクトリからではなくlsコマンドを実行するため、完全なディレクトリ名を指定する必要がありますが、出力は次のようにしたいだけです。

[me@comp]$ ls /home/user/new/*.txt
file1.txt    file2.txt    file3.txt 

パス全体は必要ありません。ファイル名のみが必要です。この問題はlsコマンドを使用して解決する必要があります。その出力は別のプログラム用であるためです。

57
Ashish

ls whateveryouwant | xargs -n 1 basename

それはあなたのために働きますか?

それ以外の場合は、(cd /the/directory && ls)(はい、括弧が意図されています)

97
fge

Xargsとallの必要はありません。lsで十分です。

ls -1 *.txt

行ごとに表示します

38
VRVigneshwara

これを実現する方法はいくつかあります。次のようなものになります。

for filepath in /path/to/dir/*
do
    filename=$(basename $file)

    ... whatever you want to do with the file here
done
10
pgl

(cd dir ; ls)

dirのファイル名のみを出力します。 1行に1つずつ必要な場合は、ls -1を使用します。

8
mrpraline

それを解決するための派手な方法は、「rev」と「cut」を2回使用することです。

find ./ -name "*.txt" | rev | cut -d '/' -f1 | rev
4
John Rumpel

コマンドラインにsedスクリプトを追加できます。

ls /home/user/new/*.txt | sed -r 's/^.+\///'
4
zuloo

私はすでにfgeによって回答されているベース名を好みます。別の方法は次のとおりです。

ls /home/user/new/*.txt|awk -F"/" '{print $NF}'

もう1つのい方法は:

ls /home/user/new/*.txt| Perl -pe 's/\//\n/g'|tail -1
2
Vijay

古い問題がときどき再発するように思えるので、誰かに役立つことを望んでいます。

私の問題は、特定のディレクトリ内の「* .txt」ファイルのすべての名前を、パスなしでDatastage 7.5シーケンスの拡張子なしでテキストファイルにリストすることでした。

使用したソリューションは次のとおりです。

ls /home/user/new/*.txt | xargs -n 1 basename | cut -d '.' -f1 > name_list.txt
0
Mauri

私たちがそれを行う方法はたくさんありますが、単にあなたがフォローを試みることができます。

ls /home/user/new | tr '\n' '\n' | grep .txt

別の方法:

cd /home/user/new && ls *.txt
0

ファイル名にスペース、引用符、その他の奇妙な文字が含まれていたため、選択した答えは私には機能しませんでした。 basenameの入力を引用するには、次を使用する必要があります。

ls /path/to/my/directory | xargs -n1 -I{} basename "{}"

これは、ファイルの名前に関係なく機能することが保証されています。

0
Addison