Bash komut yazımı için çok yeni ve biraz alıştırma yapmak için kaynak dizini ve hedef dizini alan bir komut dosyası yazmaya çalışıyorum. Komut, kaynak dizini arayacak ve alt dizinlerin yapısını hedef dizine kopyalayacaktır (herhangi bir dosya yok sayılacak, sadece dizinlerin kendileri çoğaltılacaktır). Kaynak dizini, herhangi bir derinlikte herhangi bir sayıda alt dizine sahip olabilir. Bunu başarmanın en iyi yolu ne olurdu? Bir dizin bulunursa, bu dizinin üzerine tekrarlı olarak çağrılan bir özyinelemeli fonksiyon yazmaya çalışarak başladım. Ancak, komut dosyasıyla ilgili deneyimsizliğim yüzünden, güldüm. İşte Dizin yapısını kaynak dizinden hedef dizine kopyalamak için Bash komut dosyası
Bugüne kadar ne var:#! /bin/bash
if [ ! $# -eq 2 ]; then
echo "ERROR: Script needs 2 arguments: $0 source/directory/ target/directory/"
exit
fi
SOURCE_DIR=$1
TARGET_DIR=$2
function searchForDirectory {
for FILE in ls $SOURCE_DIR/*; do #should be 'ls *current_directory*'
if [ -d $FILE ]; then
searchForDirectory #call function recursively onto $FILE
#Do stuff here to create copy of this directory in target dir
fi
done
}
if [ ! -d $SOURCE_DIR ]; then
echo "ERROR: Source directory does not exist"
exit
else
searchForDirectory
fi
Bu sadece bir iskelet işlevi olduğunu biliyoruz, ve daha bir çok çalışma içine koymak gerekecektir, ama sadece rehberlik arıyorum Bu konuda daha fazla gitmeden önce bunun doğru bir yol olup olmadığına ve eğer öyleyse, bir sonraki adımın ne olacağıyla ilgili olarak? Bir dizini işlevime nasıl geçiririm?
DÜZENLEME: İşte çözümüm, Ivan'ın yardımının #!/Bin/bash
if [ ! $# -eq 2 ]; then
echo -e "\nERROR: Script needs 2 arguments:\n$0 source/directory/ target/directory/\n"
exit
fi
function recursiveDuplication {
for file in `ls $1`; do
if [ -d $1/$file ] && [ ! -d $2/$file ]; then
mkdir $2/$file
recursiveDuplication $1/$file $2/$file
elif [[ $1/$file == *.png ]]; then
convert $1/$file $2/$file
fi
done
}
if [ ! -d $1 ]; then
echo -e "\nERROR: $1 does not exist\n"
exit
elif [ -d $2 ] && [ ! -w $2 ]; then
echo -e "\nERROR: You do not have permission to write to $2\n"
exit
elif [ ! -d $2 ]; then
echo -e "\nSUCCESS: $2 has been created"
mkdir $2
fi
recursiveDuplication $1 $2
bu çözüm ile iki sorun vardır:
Rany Albeg Wein Aşağıda açıklandığı gibi, 'ls' kullanarak iyi bir çözüm değil - ve gördüğüm neden orada dizin/*. png adındaki boşluk.
Ayrıca herhangi bir * .png dosyasını kaynaktan hedefe kopyalamaya ve hedefte bir * .jpg görüntüsüne dönüştürmeye çalışıyorum. Bunu nasıl yapabilirim? ImageMagick'in
convert image.png image.jpg
komutunu kullanmaya çalışıyorum amaimage.png
$file
olarak adlandırılırken nasıl yapıldığını bilmiyorum?
Eğer ilgileniyorsanız, 'bul 've' cpio' ile yapılabilir. kaynak bul -type d | cpio -pd hedefi. 'Kaynak'tan gelen bütün ağaç' hedefe 'kopyalanır. Eğer komut "root" tarafından yürütülürse, izin ve sahiplik korunabilir. Kök olmayan tarafından çalıştırılırsa, yalnızca izin korunabilir. – alvits
@KOB "gnu cpio" –