ディレクトリ内のファイルの場合、ファイル名のみをエコー(パスなし)


98

forループでディレクトリを反復処理する場合、ファイルのファイル名のみをエコーするにはどうすればよいですか?

for filename in /home/user/*
do
  echo $filename
done;

ファイル名を含むフルパスを取得します。ファイル名が欲しいだけです。

回答:


166

ネイティブbashソリューションが必要な場合

for file in /home/user/*; do
  echo "${file##*/}"
done

上記は、シェルにネイティブであり、外部バイナリの呼び出しを必要としないパラメータ拡張を使用していますbasename

しかし、私は単に使用することをお勧めします find

find /home/user -type f -printf "%f\n"

9
いい答えだ。パラメータ拡張についてさらに学習したい人のために:wiki.bash-hackers.org/syntax/pe#substring_removal
DougW

1
-printf:原発不明またはオペレータ=> unix.stackexchange.com/a/272493/72893
のび太

2
スペースを含むファイル名をサポートする${file##*/}よう"${file##*/}"に変更することを検討してください(「My filename with space.txt」など)。
WinEunuuchs2Unix

echo "$ {file ## * /}"は空の文字列を返します
Alessandro C

47

ただ使用するbasename

echo `basename "$filename"`

$ filenameにスペースなどが含まれている場合は、引用符が必要です。


3
パラメータ拡張を使用する方が良いです。外部バイナリを呼び出す必要はありません。
SiegeX 2012年

5
ところで、 ``は非推奨です。$()Oliのように使用する方が良い
SiegeX 2012年

1
この古い回答にコメントして申し訳ありませんが、ベース名はスペースのあるファイルでは正しく機能しません。例:pwd出力​​:/test 1basename $(pwd)出力:test。OS XおよびUbuntu Server(14.04)でテスト済み。@SiegeXが推奨するネイティブbashソリューションが私にとってはうまくいきました。
MarkoGrešak2014年

@MarkoGrešak basename "$(pwd)"代わりに使用してください。
YoungFrog 2015

@YoungFrogは入力をありがとう、それは9か月前でした。また$PWD、コマンドを実行する代わりに変数を使用することをお勧めします。
MarkoGrešak15年

15

使用basename

echo $(basename /foo/bar/stuff)

なぜ使うのechobasename結果はすでに印刷されています。echoサブシェルを引用符で囲まないと、結果が壊れる場合もあります。例:echo $(basename path/with\ \ spaces)正しく印刷されないwith spaces(1つのスペースのみ)。
ソコウィ

7

別の方法はls、ディレクトリ内のファイルリストを読み取るときに使用して、必要なもの、つまり「ファイル名のみ」を提供することです。完全なファイルパスを読み取ってから、forループの本文で「ファイル名」コンポーネントを抽出するのではなく、

あなたのオリジナルに従う以下の例:

for filename in $(ls /home/user/)
do
  echo $filename
done;

ファイルと同じディレクトリでスクリプトを実行している場合、スクリプトは次のようになります。

for filename in $(ls)
do
  echo $filename
done;

1
ls*通常は展開しないドットファイルが含まれます。また、for f in $(...) ...任意のファイル名は、あなたがIFSを設定しない限り、任意のファイル名はグロブ文字が含まれている場合は、-f / -o noglobファイルを設定しない限り、失敗する可能性があり、システムまたはシェルによっては空白文字が含まれている場合は失敗したecho任意のファイル名がハイフン+文字であるか、バックスラッシュが含まれている場合に失敗することがあります。OTOHだけでls -1 /path/to/dir、ドットファイルの違いを法として、各ファイル名を1行に確実に印刷します。
dave_thompson_085

0

ファイル名のみが必要な場合:

for file in /home/user/*; do       
  f=$(echo "${file##*/}");
  filename=$(echo $f| cut  -d'.' -f 1); #file has extension, it return only filename
  echo $filename
done

詳細については、cutコマンドを参照ここ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.