回答:
ネイティブbash
ソリューションが必要な場合
for file in /home/user/*; do
echo "${file##*/}"
done
上記は、シェルにネイティブであり、外部バイナリの呼び出しを必要としないパラメータ拡張を使用していますbasename
しかし、私は単に使用することをお勧めします find
find /home/user -type f -printf "%f\n"
${file##*/}
よう"${file##*/}"
に変更することを検討してください(「My filename with space.txt」など)。
ただ使用するbasename
:
echo `basename "$filename"`
$ filenameにスペースなどが含まれている場合は、引用符が必要です。
$()
Oliのように使用する方が良い
/test 1
、basename $(pwd)
出力:test
。OS XおよびUbuntu Server(14.04)でテスト済み。@SiegeXが推奨するネイティブbashソリューションが私にとってはうまくいきました。
basename "$(pwd)"
代わりに使用してください。
$PWD
、コマンドを実行する代わりに変数を使用することをお勧めします。
使用basename
:
echo $(basename /foo/bar/stuff)
echo
?basename
結果はすでに印刷されています。echo
サブシェルを引用符で囲まないと、結果が壊れる場合もあります。例:echo $(basename path/with\ \ spaces)
正しく印刷されないwith spaces
(1つのスペースのみ)。
別の方法はls
、ディレクトリ内のファイルリストを読み取るときに使用して、必要なもの、つまり「ファイル名のみ」を提供することです。完全なファイルパスを読み取ってから、forループの本文で「ファイル名」コンポーネントを抽出するのではなく、
あなたのオリジナルに従う以下の例:
for filename in $(ls /home/user/)
do
echo $filename
done;
ファイルと同じディレクトリでスクリプトを実行している場合、スクリプトは次のようになります。
for filename in $(ls)
do
echo $filename
done;
ls
*
通常は展開しないドットファイルが含まれます。また、for f in $(...) ...
任意のファイル名は、あなたがIFSを設定しない限り、任意のファイル名はグロブ文字が含まれている場合は、-f / -o noglobファイルを設定しない限り、失敗する可能性があり、システムまたはシェルによっては空白文字が含まれている場合は失敗したecho
任意のファイル名がハイフン+文字であるか、バックスラッシュが含まれている場合に失敗することがあります。OTOHだけでls -1 /path/to/dir
、ドットファイルの違いを法として、各ファイル名を1行に確実に印刷します。