Dizin yapısını koruyarak dosyaları tekrar tekrar dosya uzantısına göre kopyalayabilir miyim?


71

Linux komut satırında (çok büyük) bir .txtdosya kümesini bir dizinden (ve alt dizinlerinden) diğerine kopyalamak istiyorum .

Sağlam kalabilmek için dizin yapısına ihtiyacım var ve bitenler dışındaki dosyaları yoksaymam gerekiyor .txt.


2
Sorunuzda cp olması ve etiket olarak bulunması, bu seçeneklere bağlı olduğunuz anlamına mı geliyor? Veri kümeniz çok büyük olduğundan, kopyalama işleminin bazı nedenlerle kesintiye uğrayabileceğini ve yeniden başlatmanız gerekeceğini varsaymak mantıklıdır. Find / cp yaklaşımının aktarma işlemine devam edip yalnızca eksik kısmı kopyalayabileceğinden emin değilim. / Cp'ye bağlı değilseniz, daha akıllı olan rsync'i düşünebilirsiniz. Onun --exclude seçeneği .txt dosyalarını atlamanıza izin verir.
08

Adil arama - rsync muhtemelen daha iyi bir seçenektir. Bulmak için bağlı değil / cp. (Onları yine de kullandım - uzak makineye rsync kurulu değildi, canlı bir web sunucusuydu ve olabildiğince az yer kaplamak istemiştim)
sahipsiz

Yanıtlar:


95

Bunu yapmak için find ve cpio kullanabilirsiniz.

cd /top/level/to/copy
find . -name '*.txt' | cpio -pdm /path/to/destdir

(-updm for overwrite destination content.)

neden m Sadece dosyayı değiştirme tarihini korumak için düşündüm.
Mubashar

7
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;

Bir .sonradan özlüyorsun find. Ayrıca MacOS 10.13.1 üzerine, bu çalıştı:find . -type f -name "*.txt" -exec install -v {} /dest/path/{} \;
gaddar

2

Başka bir yaklaşım

find . -name '*.txt' -exec rsync -R {} path/to/dext \;


Bu çözümü sevdim. Eskiden find . -iname '*.txt' -exec rsync -Rptgon {} path/to/dext \;duyarsız bir eşleşme yapardım, sahiplik ve izinlerin korunmasını yapardım.
MountainX

1

Benim için işe yarayan en kolay yol:

cp --parents -R jobs/**/*.xml ./backup/

Bir yakalama, "ana yol" doğru olduğundan, önce "istenen" dizine gitmeniz gerekir.

Ayrıca özyinelemeli globları bash'te etkinleştirdiğinizden emin olun:

shopt -s globstar

1

peki ya ilk kopyalamayı bitsin

cp -r /old/folder /new/folder

sonra yeni klasöre gidin ve çalıştırın

find . -type f ! -iname "*.txt" -delete

ya da sadece

cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete

Düzenleme: Tamam, filtreleyen bir komut istiyorum (Bunu sistemde cpiokomut olmadığı için test etmedim !). İşte bulduğum yer: http://www.gnu.org/software/findutils/manual/html_mono/find.html#Copying-A-Subset-of-Files

find . -name "*.txt" -print0 |
     cpio -pmd0 /dest-dir

Lütfen önce bunu test edin, çünkü henüz denemedim. Biri doğrularsa, harika olurdu.


sallıyor alkış - Bu işe yarar, ama filtreleme olmadan ben (birkaç yüz GB dışarı geliyor) birkaç milyon dosyaları bakıyorum .txt. Gerekirse yapmak zorunda kalabilirim, ancak mümkünse fotokopi çekerken filtrelemeyi çok isterim
talep edilmemişbaggage

1
Şerefe, düzenlenen sürüm '0' -pmd0 kaldırırsam çalışır
unclaimedbaggage

Sen tutmalı 0in -pmd0ve eklemek -print0sonuna find(hemen önce komuta |).
G-Man

1

MacOS'ta da aynı şeyi yapmaya çalışıyordum, ancak seçeneklerin hiçbiri benim için işe yaramadı. Keşfetene kadar ditto.

Birçok .wav dosyasını kopyalamak zorunda kaldım ve Video dosyalarını atlatmasını sağladım ... İşte burada buldum:

find . -type f -iname "*.wav" -ls -exec ditto {} /destination/folder/{} \;

  • find .- Geçerli klasördeki bulmayı çalıştırır. cd /source/folderbaşlamadan önce emin ol

  • -type f - Yalnızca dosyaları aramayı belirtir

  • -iname "*.wav" - Bu, büyük / küçük harfe duyarsız * .wav aramasını söyler
  • -ls- Bu, üzerinde çalıştığı dosyayı gösterir. Aksi takdirde hiçbir şey göstermez.
  • -exec ditto {} /destination/folder/{} \; - Aynı dizin ağacına sahip dosyaları kopyalayıp oluşturma işini yapar.

0

Dizine gidin:

find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination

Düzenli ifadeleri yönetiyorsanız, biraz daha açık ve güçlüdür.


-1

Dizine gidin:

cp '*.css' /path/to/destination

Dizindeki her klasöre gitmeniz gerekir, ancak bu şimdiye kadar gördüğüm seçeneklerin çoğundan daha iyi.


Bu yöntem özyinelemeli değildir; bu, büyük dizinler için bunu uzun bir süre yapabileceğiniz anlamına gelir ...
Iain Reid
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.