Bir dizini for döngüsü ile yinelersem, bir dosyanın yalnızca dosya adını yankılamaya nasıl başlayabilirim?
for filename in /home/user/*
do
echo $filename
done;
dosya adı ile tam yolu çekecektir. Sadece dosya adını istiyorum.
Bir dizini for döngüsü ile yinelersem, bir dosyanın yalnızca dosya adını yankılamaya nasıl başlayabilirim?
for filename in /home/user/*
do
echo $filename
done;
dosya adı ile tam yolu çekecektir. Sadece dosya adını istiyorum.
Yanıtlar:
Yerel bir bashçözüm istiyorsanız
for file in /home/user/*; do
echo "${file##*/}"
done
Yukarıdakiler , kabuğa özgü olan ve aşağıdaki gibi harici bir ikiliye çağrı gerektirmeyen Parametre Genişletmesini kullanır .basename
Ancak, sadece kullanmayı önerebilir miyim? find
find /home/user -type f -printf "%f\n"
${file##*/}için değiştirmeyi düşünün "${file##*/}", örn. "Boşluk.txt ile dosya adım".
Sadece şunu kullanın basename:
echo `basename "$filename"`
$ Dosya adının boşluk içermesi durumunda tırnak işaretleri gereklidir.
$()Oli'nin yaptığı gibi kullanmak daha iyi
/test 1, basename $(pwd)çıkışı: test. OS X ve Ubuntu Sunucusunda (14.04) test edilmiştir. @SiegeX'in önerdiği gibi yerel bash çözümü benim için çalıştı.
basename "$(pwd)"Bunun yerine kullanın .
$PWDkomutu çalıştırmak yerine değişkeni kullanmak daha iyi olacaktır .
Kullanım basename:
echo $(basename /foo/bar/stuff)
echo? basenamesonuçları zaten yazdırıyor. echoalt kabuğu alıntı yapmazsanız sonucu bile karıştırabilir. Örnek: echo $(basename path/with\ \ spaces)yanlış yazdırılıyor with spaces(yalnızca bir boşluk).
Diğer bir yaklaşım, lsbir dizin içindeki dosya listesini okurken size istediğinizi, yani "sadece dosya adlarını" vermek için kullanmaktır. Tam dosya yolunu okumak ve ardından for döngüsünün gövdesindeki "dosya adı" bileşenini çıkarmaktan farklı olarak.
Orijinalinizi takip eden aşağıdaki örnek:
for filename in $(ls /home/user/)
do
echo $filename
done;
Komut dosyasını dosyalarla aynı dizinde çalıştırıyorsanız, o zaman basitçe şöyle olur:
for filename in $(ls)
do
echo $filename
done;
ls*genişlemenin genellikle bulunmadığı tüm nokta dosyalarını içerir . Ayrıca for f in $(...) ..., IFS'yi ayarlamadığınız sürece herhangi bir dosya adı boşluk içeriyorsa başarısız olur, -f / -o noglob ayarlamadığınız sürece herhangi bir dosya adı bir glob karakter içeriyorsa başarısız olabilir ve sistem veya kabuğa bağlı olarak, echoherhangi bir dosya adı tire + harf ise veya ters eğik çizgi içeriyorsa başarısız olabilir. OTOH, ls -1 /path/to/dirher bir dosya adını güvenilir bir şekilde bir satıra yazdırır, dotfiles farkını modüle eder.