sed
Herhangi bir * nix'de mevcut olduğunu varsayabiliriz , ancak sed -n
mv komutları oluşturmayı destekleyeceğinden emin olamayız . ( NOT:sed
Bunu yalnızca GNU yapar.)
Yine de, bash yerleşikler ve sed, bunu yapmak için hızlı bir şekilde bir kabuk işlevi oluşturabiliriz.
sedrename() {
if [ $# -gt 1 ]; then
sed_pattern=$1
shift
for file in $(ls $@); do
mv -v "$file" "$(sed $sed_pattern <<< $file)"
done
else
echo "usage: $0 sed_pattern files..."
fi
}
Kullanım
sedrename 's|\(.*\)\(-[0-9.]*\.pkg\)|\1\2|' *.pkg
before:
./Xft2-2.1.13.pkg
./jasper-1.900.1.pkg
./xorg-libXrandr-1.2.3.pkg
after:
./Xft2.pkg
./jasper.pkg
./xorg-libXrandr.pkg
Hedef klasörler oluşturma:
Yana mv
otomatik yaratmaz hedef klasörleri biz bizim ilk sürümünü kullanarak olamaz sedrename
.
Oldukça küçük bir değişiklik, bu nedenle bu özelliği eklemek güzel olurdu:
abspath
Bash'de bu yapı bulunmadığından , bir yardımcı program işlevine (veya mutlak yola) ihtiyacımız olacak.
abspath () { case "$1" in
/*)printf "%s\n" "$1";;
*)printf "%s\n" "$PWD/$1";;
esac; }
Buna sahip olduğumuzda, yeni klasör yapısını içeren bir sed / yeniden adlandırma modeli için hedef klasör (ler) oluşturabiliriz.
Bu, hedef klasörlerimizin adlarını bilmemizi sağlayacaktır. Yeniden adlandırdığımızda, onu hedef dosya adında kullanmamız gerekecek.
# generate the rename target
target="$(sed $sed_pattern <<< $file)"
# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"
# finally move the file to the target name/folders
mv -v "$file" "$target"
İşte tam klasör duyarlı komut dosyası ...
sedrename() {
if [ $# -gt 1 ]; then
sed_pattern=$1
shift
for file in $(ls $@); do
target="$(sed $sed_pattern <<< $file)"
mkdir -p "$(dirname $(abspath $target))"
mv -v "$file" "$target"
done
else
echo "usage: $0 sed_pattern files..."
fi
}
Elbette, belirli hedef klasörlerimiz olmadığında da çalışıyor.
Tüm şarkıları bir klasöre koymak ./Beethoven/
istersek, bunu yapabiliriz:
Kullanım
sedrename 's|Beethoven - |Beethoven/|g' *.mp3
before:
./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3
after:
./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3
Bonus turu ...
Dosyaları klasörlerden tek bir klasöre taşımak için bu komut dosyasını kullanın:
Eşleşen tüm dosyaları toplamak ve mevcut klasöre yerleştirmek istediğimizi varsayarsak, bunu yapabiliriz:
sedrename 's|.*/||' **/*.mp3
before:
./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3
after:
./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3
Sed normal ifade kalıplarıyla ilgili not
Bu komut dosyasında normal sed model kuralları geçerlidir, bu modeller PCRE (Perl Uyumlu Normal İfadeler) değildir.
Platformunuza bağlı olarak sed -r
veya sed -E
bunlardan birini kullanarak genişletilmiş düzenli ifade sözdizimi sed olabilir .
man re_format
Sed temel ve genişletilmiş regexp kalıplarının tam bir açıklaması için POSIX uyumlu bakın .