Dosyaları güvenli bir şekilde bir dizine nasıl taşıyabilirsiniz?


10

Dosyaları, dizinde yüzlerce veya binlerce dosya olabileceği bir dizine nasıl taşıyabilirim ve içinde dupes olup olmadığından emin olamayabilirsiniz ... Hangi yöntemi kullanırdınız?

Dupes'lerin nasıl işleneceği değişecektir, bazen üzerine yazacağız, bazen daha güvenli olmalıyız. IO önemli olabilir, çünkü bunlar üretim sunucularıdır. Ancak miktar verildiğinde, yinelenmeyen dosyalar için bir bilgi istemi bir seçenek değildir. İzinlerin ve zaman damgalarının vb. Korunması önemlidir. Verilerin ne olduğunu genellikle bilemeyiz.

Oh ve kullanmak mvgerekli değildir rsync, cpçözümler hoş geldiniz.

not: CentOS 5.5 kullanıyoruz, bu yüzden daha yeni bir özellik olduğu için orada çalışmayacak mı?


Ypu çiftler hakkında ne yapmak isterdi?

@Iain duruma bağlı mı? Bir webhost'ta çalışıyorum ... bu gerçekten mvve bu durumda korumaya önem verip vermememize ve zaten bir yedekleme yapıp yapmadığımıza bağlı. Bu soru oldukça açık. Sadece iyi seçenekler arıyorum ve belki de sizi ısırıp ısıtmayacağı ve nasıl yapılacağı hakkında bir yorum arıyorum.
Aralık'ta xenoterracide

Kabuğun işlemek için çok fazla dosya olduğunu varsayalım mv * ../veya mv -i * ../?
Michael Mrozek

@ Michael eminim değişir ... bazı durumlarda muhtemelen değil. Bazı durumlarda belki. Çalışma ortamım için mümkün olduğunca çok seçenek yakalamaya çalışıyorum.
Aralık'ta xenoterracide

Yanıtlar:


6

Ebeveyn rsync kullanmanızı tavsiye ederim:

rsync -avPr -b --suffix='-original' child/* .

üstteki varolan tüm yinelenen dosyaları -orijinal dosyasına yedekler.


Bence -aima ediyor-r
xenoterracide

@xenoterracide - Doğru mu 'r'
Tok

@Tok kopyanın hardlink olarak yapılması mümkün mü? IO israf etmemek için. (gibi -liçin cp)
xenoterracide

@xenoterracide - Sabit bağlantıları korumak için rsync için -Hveya --hard-linksbayraklarını kullanabilirsiniz .
Tok

1
@xenoterracide - --link-dest=DIRBu davranışı elde etmek için bayrağı şu şekilde kullanabilirsiniz : rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/Bu, dst / src ile src arasındaki değişmeyen dosyalara (bu durumda tüm dosyalar) sabit bağlantı kuracaktır. Normalde, yedek dosyaları, verilerini kopyalamaksızın yeniden bağlamak istediğinizde kullanıldığını görürsünüz --link-dest=/most/recent/backup.
Tok

4
cp -bal . ..

Bu, geçerli dizindeki her şeyi üstündeki dizine kopyalar, tüm izinleri korur, mümkünse IO'yu en aza indirmek için sabit bağlantıları kullanır ve kopyalarda dosya adı oluşturur ~

Daha sonra

rm -rf . ; cd .. ; rmdir <originaldir>;

muhtemelen çok sayıda dosya sorunu ile karşılaşır ... ama rsync gibi IO yoğun değildir.
Aralık'ta xenoterracide

2

Bu örnekte dosyaları '/ parent / old-dir' klasöründen '/ parent' dizinine taşıyacağız:

cd /parent

rsync -av --progress old-dir/ .

rm -rf old-dir

Rsync kurallarına göre dups'leri yeni dosyalarla değiştirir old-dir.


1

Deneyebilirsin

find . -maxdepth 1 -print0 | xargs -I '{}' -r0 mv '{}' ..

hangi dupe dosyalarının üzerine yazacak ..

İçindeki dupe aynı veya daha yeni ise üzerine yazmak için mv -u '{}' kullanabilirsiniz.


boru neden xargs'ı bulur? neden +
xenoterracide

1
@xenoterracide - Alışkanlık ve taşınabilirlik (bu bir GNU oluşumudur). Sadece bunu denedim ve ikinci parametre olarak geçirmek nasıl bilemiyorum Bunun üzerine ..için mv '{}' ++ olarak sonuna ekler olarak komuta.

+ @Iain POSIX içindedir I aslında daha önce GNU bulmak almak için geç olduğunu söylendi.
Aralık'ta xenoterracide

Haklısın ama yine de kullanmak için bir yol

2
@xenoterracide: GNU coreutils olarak: -exec mv -t .. -- {} +. Portably: -exec sh -c 'mv -- "$@"' _ {} +.
Gilles 'SO- kötü olmayı kes

1

mv -i yalnızca hedef varsa sorulur.

yes n | mv -i …hedef dizinde bulunmayan tüm dosyaları taşır. FreeBSD ve OSX'te bunu kısaltabilirsiniz mv -n ….

Bunların hiçbirinin dizin bağımsız değişkenini hedef dizinde aynı adda varolan bir diziyle birleştirmeyeceğini unutmayın.


Ayrı bir sorun, geçerli dizindeki tüm dosyalar üzerinde nasıl hareket edileceğidir. İki sorun vardır: tüm dosyaları yakalama ( *nokta dosyalarını atlar) ve komut satırında çalışmaz. Linux'ta (veya daha genel olarak GNU find ve GNU coreutils ile):

find . -mindepth 1 -maxdepth 1 -exec mv -i -t .. -- {} +

GNU bulduğunda ancak GNU coreutils (veya daha eski GNU coreutils) ile:

find . -mindepth 1 -maxdepth 1 -exec sh -c 'mv -i -- "$@" "$0"' .. {} +

portably:

find . -name . -o -exec sh -c 'mv -i -- "$@" "$0"' .. {} -type d -prune

Her zamanki gibi zsh işleri kolaylaştırır. Dahili olarak bir komut satırı uzunluğu sınırlaması yoktur, bu nedenle mvyerleşikini kullanırsanız bunun için endişelenmenize gerek yoktur. Ve Dglob niteleyicisi ile nokta dosyalarını yok saymamayı söyleyebilirsiniz . Sınırlama: bu, dosya sistemlerinde çalışmaz (zsh 4.3.10 itibariyle).

zmodload zsh/files
mv -i -- *(D) ..

birçok tartışmaya?
Aralık'ta xenoterracide

0

ML'mize dedim ki

mv * ..

Açıkçası bu çok güvenli değil ... şeylerin üzerine yazacak. Hiç girmediğim sınırlar olabilir.


2
Çok sayıda dosyanız varsa, büyük olasılıkla bir 'bağımsız değişken listesi çok uzun hata' alırsınız.

2
İle başlayan bir dosya adınız varsa kötü şeyler yapabilir -. Adı ile başlayan dosyaları yakalamaz ..
Gilles 'SO- kötü olmayı kes

0

Aşağıda geçmişte iyi bir etki yaratmak için kullandığım bir python şablonu.

#!/usr/bin/env python
#
# Bart Kastermans, www.bartk.nl
#
# rename of collection of files in a directory
import os
import shutil

# only work on files whose name starts with a D
files = [filename for filename in os.listdir ("/Users/kasterma/Music/Audio Hijack/") if filename[0] =="D"]

for filename in files:
    shutil.move (filename, filename [:23] + ".mp3")
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.