Tüm dosyaları aynı dosya adı önekine sahip bir dizine nasıl taşıyabilir (veya kopyalayabilirsiniz)?


9

Bash Kullanımı

Diyelim ki bir üst dizine rastgele yerleştirilmiş bir sürü dosyam var ~/src, belirli bir sonekle eşleşen tüm dosyaları almak ve bunları bir ~/distdizine taşımak (veya kopyalamak) istiyorum .

Bu amaçla tüm dosya adlarının bu adlandırma kuralına sahip olduğunu varsayalım:

<filename_prefix>.<filename_suffix>

Bu belirli bir tüm dosyaları almak filename_suffixve bir dist klasörüne koymak için hızlı bir yol olduğunu öğrendim :

mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

Şimdi daha ileri bir adım ... nasıl bu durumda, find çıkışını kullanabilirsiniz filename, ve kullanımı filename_prefixaynı adlı bir dizin oluşturmak için ~/distuygun dizine o önek ile tüm dosya ve daha sonra hareket (veya kopyalama)?

mkdir ~/dst
find source -name "*.xrt,*.ini,*.moo" -exec mv -i {} -t ~/dst \;

Aslında, böyle bir yapı oluşturmak için yukarıdaki komutu nasıl değiştirebilirim (veya belki de başka bir komut kullanabilirim)

(ÇIKTI)

~/dist/people/people.xrt
~/dist/games/games.xrt
~/dist/games/games.moo
~/dist/games/games.ini
~/dist/monkeys/monkeys.ini
~/dist/monkeys/monkeys.xrt

böyle bir dizin ağacından mı?

(GİRİŞ)

~/src/xrt/people.xrt
~/src/xrt/games.xrt
~/src/conf/games.ini
~/src/pack/monkeys.xrt
~/src/e344/games.moo
~/src/e344/monkeys.moo
~/src/en-us/monkeys.ini

Yanıtlar:


10

findBu durumda ne yapacağımı söylemek cehennem olur .

Kabuğu daha iyi kullanın:

for i in **/*.{xrt,ini,moo}; do
  FILE=$(basename "$i")
  DIR=~/dst/${FILE%.*}
  echo mkdir -p -- "$DIR"
  echo mv -i -t "$DIR" -- "$i"
done

Globun çalışması shopt -s globstariçin kullanın **(veya zsh kullanın!). echoKomut istediğinizi yazdırıyorsa s'yi daha sonra kaldırın .


bash kullanmak aynı mıdır?
qodeninja

@codeninja shopt -s globstar, düzenlememe bakın. Yalnızca iki seviye varsa, kullanabilirsiniz */*.*ve snippet herhangi bir kabukta çalışacaktır.
Gilles 'SO- kötü olmayı bırak'

2

hile bulmak komut satırı:

find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

aslında LOL bulmak bash betiği çağırmak için etrafında bir çalışma.

P =


1
Bil bakalım denilen bir dosya varsa ne olur… happy rm -rf /! Bu tür kodlar -1'i hak eder.
Stéphane Gimenez

Düzenlemeniz yeterli değil: diyelim ki bir bağlantıdan hoşlandınız ve indirdiniz Yay" rm -rf / "Rox0r.avi, yine bir sorun var…
Stéphane Gimenez

(Ve bu tür bir ikameyi güvenli hale getirmenin bir yolu yoktur).
Stéphane Gimenez

1
Ah belki bunu farklı şekilde yapmak mümkündür. Şu çalışıyor görünüyor: -exec bash -c 'command which uses "$1"' bash '{}' ';'. Zaten, oldukça anlamsız.
Stéphane Gimenez

1
@ StéphaneGimenez yaptı, bash kullanılacak tek şey değil. LOL
yuyichao
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.