Birden fazla dosyayı üst klasör adlarından yeniden adlandırmak için Shell komut dosyası


3

Bunun gibi bir dosya yapısına sahibim:

  • 00000010
    • 000000001.file1
    • 000000001.file2
  • 00000020
    • 00000003.file1
    • 00000003.file2
    • 00000003.file3
  • ...

Bu nedenle, 8 basamaklı sayılarla başlayan adı olan bir cevher daha fazla dosya içeren 8 basamaklı ada sahip klasörler var. Ancak bu tezlerin isimleri - diyelim - senkronize değil. Şimdi onları tekrarlamak için bash olarak arşive yeniden adlandırmaya çalışıyorum:

  • 00000010
    • 000000010.file1
    • 000000010.file2
  • 00000020
    • 00000020.file1
    • 00000020.file2
    • 00000020.file3
  • ...

Komut dosyam şuna benziyor:

#! /bin/bash

find * -maxdepth 1 -name "*" -type d | while read -r dir
do
        rename 's/$dir\/[0-9]{8}/$dir/' *
done

Ancak bu çalışmıyor ve gibi hatalar veriyor

Genel sembolü "$ dir" (eval 1) 1 satırında açık bir paket adı gerektiriyor.

Dosyaları klasör adlarına göre yeniden adlandırmak için nasıl yazabilirim?

Yardımın için teşekkürler!


Yanıtlar:


2

Başka bir cevaptan, kullanmam gerektiğini öğrendim

rename "s/$dir\/[0-9]{8}/$dir\/$dir/" $dir/*

Sadece birinin de aynı problemi olması durumunda ...


0

$dirDesene dahil edilen cevabı sevmiyorum . Dizin, örneğin özel bir regexp belirteci olarak yorumlanacak bir karakter içeriyorsa beklenmeyen sonuçlara yol açabilir.

Dosyaları doğrudan kalıpta eşleştirmeyi tercih ederim, dizinler üzerinde döngü yapma ihtiyacını ortadan kaldırır ve sadece normal bir glob kullanırım.

rename 's#([^/]+)/[^/]+(\.file[0-9]+)$#$1/$1$2#' base_directory/*/*

glob, dizinler içindeki bireysel dosyalara isabet ettiğinde (hatta belirtilmiş base_directory/*/*.file*veya benzeri olabilir ancak burada önemi olmamalıdır).

Bu, findyapım için gerek kalmadan tam komut olduğunu unutmayın .

  • Kalıplardan kaçmak zorunda kalmamak #için "normal" yerine ayırıcı olarak kullanıyorum /.
  • "Açgözlü" grubu "değil bir dizin ayırıcısı", ardından bir dizin ayırıcısı, ardından bir dosya adı ve satır sonu izlerim. Bu, ilk yakalama grubunu her dosyanın ana dizini yapar.
  • Sıra adının son ekini tutma bitişi hariç, dosya adının ilk kısmı atılır.

Dosyaların 8 karakter uzunluğunda olduğunu varsaymaktan daha genel bir yaklaşım kullanmayı seçtim, ancak asıl fark, findyapıya ihtiyacım olmadığı veya $dirdeğişkeni (muhtemelen güvensiz) regexp ortamına sıkıştırmam gerektiğidir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.