Komut dosyanızda çeşitli olası hata noktaları var. Her şeyden önce, eşleşen tüm dosyaların bir listesini oluşturmak rm *.old*
için globbing kullanır ve bu boşluk içeren dosya adları ile başa çıkabilir. Ancak betiğiniz globun her sonucuna bir değişken atar ve bunu tırnak işareti olmadan yapar. Dosya adlarınız boşluk içeriyorsa bu bozulur. Örneğin:
$ ls
'file name with spaces.old.txt' file.old.txt
$ rm *.old.* ## works: both files are deleted
$ touch "file.old.txt" "file name with spaces.old.txt"
$ for i in ./*; do oldfile=$i; rm -v $oldfile; done
rm: cannot remove './file': No such file or directory
rm: cannot remove 'name': No such file or directory
rm: cannot remove 'with': No such file or directory
rm: cannot remove 'spaces.old.txt': No such file or directory
removed './file.old.txt'
Gördüğünüz gibi, döngü adında boşluk bulunan dosya için başarısız oldu. Doğru yapmak için değişkeni alıntılamanız gerekir:
$ for i in ./*; do oldfile="$i"; rm -v "$oldfile"; done
removed './file name with spaces.old.txt'
removed './file.old.txt'
Aynı sorun $i
, betiğinizdeki hemen hemen her kullanım için de geçerlidir . Her zaman değişkenlerinizi belirtmelisiniz .
Bir sonraki olası sorun, *.old.*
uzantıya sahip dosyalarla eşleşmesini beklediğiniz gibi görünüyor .old
. Öyle değil. "0 veya daha fazla karakter" ( *
), sonra a .
, sonra "eski", sonra başka .
ve daha sonra "0 veya daha fazla karakter" ile eşleşir . O edeceği Bu araçlar değil gibi bir şey eşleşmesi file.old
, ancak `file.old.foo gibi tek bir şey:
$ ls
file.old file.old.foo
$ for i in *; do if [[ "$i" == *.old.* ]]; then echo $i; fi; done
file.old.foo
Yani, maç düşmanı yok file.old
. Her durumda, betiğiniz gerekenden çok daha karmaşıktır. Bunun yerine şunu deneyin:
#!/bin/bash
for i in *; do
if [[ -f "$i" ]]; then
if [[ "$i" == *.old ]]; then
rm -v "$i" || echo "rm failed for $i"
else
echo "$i doesn't have an .old extension"
fi
cp -v "$i" "$i".old
else
echo "$i is not a file"
fi
done
Ben ekledi Not -v
için rm
ve cp which does the same thing as what you were doing with your
echo` ifadeleri.
Örneğin, file.old
kaldırılacağını bulduğunuzda ve daha sonra komut dosyası kopyalamaya çalışacağından ve dosya artık mevcut olmadığından başarısız olacağından bu mükemmel değildir. Bununla birlikte, senaryonuzun aslında ne yapmaya çalıştığını açıklamıyorsunuz, bu yüzden gerçekten neyi başarmaya çalıştığınızı söylemediğiniz sürece bunu sizin için düzeltemem.
İstediğiniz şey i) .old
uzantıya sahip tüm dosyaları kaldırmak ve ii) .old
uzantıyı sahip olmayan mevcut dosyalara eklemek ise , gerçekten ihtiyacınız olan şey:
#!/bin/bash
for i in *.old; do
if [[ -f "$i" ]]; then
rm -v "$i" || echo "rm failed for $i"
else
echo "$i is not a file"
fi
done
## All the ,old files have been removed at this point
## copy the rest
for i in *; do
if [[ -f "$i" ]]; then
## the -v makes cp report copied files
cp -v "$i" "$i".old
fi
done
rm *.old.*
bu dosyaları kaldırır ancak file.old yedek dosyasını değil. Bunu senaryomda yapmaya çalışıyorum. Teşekkürler