Mv -f'nin amacı nedir?


34

GNU coreutils manuelmv diyor:

-f --force Do not prompt the user before removing a destination file.

Ancak, bu zaten için varsayılan davranış gibi görünüyor, bu mvyüzden -fseçenek gereksiz görünüyor. GNU Bash sürüm 4.3.11’de:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2

-fBayrağın amacının geçersiz kılınması muhtemel görünmüyor alias mv="mv -i", çünkü bunu daha öz ve komutlar arasında tutarlı bir şekilde yapabilecek bir takma adı geçersiz kılmanın birkaç standart yolu vardır (örneğin, kullanma \mv).

El kitabında, "-i, -f, -n seçeneklerinden birden fazlasını belirtirseniz, yalnızca sonuncusu geçerli olur" diyor ancak yine de -fbayrağın amacı -igenel olarak bayrağını geçersiz kılmaktır. Çünkü eşdeğer davranış, kullanmaktan mvdaha öz ve özlü olan basitçe kullanılarak elde edilebilir mv -if.

Durum böyle, -fbayrağın amacı nedir? Neden var


6
Varsayılan değerler titiz bir iştir. mountÖrneğin, daha iyi örnekler olsa da gibi bir araç kullanın . Her seçenek için varsayılan değerlerin ne olduğunu hatırlamak mı istiyorsunuz, böylece hangi seçenekleri ayarlamanız gerektiğini belirleyebilirsiniz. Hem varsayılan hem de varsayılan olmayan seçeneklere sahip olmak İYİ BİR ŞEYDİR, bu nedenle, varsayılanın ne olduğunu zihinsel olarak takip etmek zorunda kalmak yerine, seçeneği açıkça belirleyebilirsiniz. Bir şey var bir şey daha hatırlamak daha kolaydır orada .
Wildcard,

MV, mv-i'ye
yükseltilirse

1
IMO, aynı zamanda komut dosyalarında kullanmak için de güzel, çünkü siz açıkça davranıyorsunuz. Niyeti biraz daha iyi iletir.
Blacklight Shining

Yanıtlar:


41

Kullanımı -fdaha net açıklanan kılavuz sayfasında nerede 4BSD gelen -fve -iseçenekleri eklendi:

Eğer Dosya2 zaten var önce onu kaldırılır dosya1 taşınır. Eğer file2 yazmayı yasaklayan bir moda sahipse, mv modu basar ve bir satır elde etmek için standart girişi okur; çizgi y ile başlıyorsa, hareket gerçekleşir; değilse, mv çıkar.

Seçenekler:

-ietkileşimli mod anlamına gelir. Ne zaman bir hareket, mevcut bir dosyayı üst üste bindirmek isteniyorsa, kullanıcıya dosya adı ve ardından bir soru işareti gelir. 'Y' ile başlayan bir çizgiyle cevap verirse, hareket devam eder. Başka bir cevap, hareketin gerçekleşmesini önler.

-fgüç anlamına gelir. Bu seçenek, herhangi bir mod kısıtlamasını veya -ianahtarı geçersiz kılar .

Mv'nin nasıl işlediğinin daha kesin bir tanımı POSIX standardında verilmiştir; bu , -fsadece -ikomut satırında gerçekleşirse geçersiz kılınmasını sağlar .

Bu yüzden varsayılan davranış biraz farklıdır -f. Varsayılan değer, yalnızca hedefin yazılabilir olmadığı durumlarda onay istemektir. (Bu davranış kadarıyla geri en az gider V4 , mvherhangi bir seçeneği sürmedi.) Eğer -iseçenek verilir hedef var her, mv ayrıca onay isteyecektir. -f(Herhangi bir sonra oluşursa seçenek durumlarda her iki soran inhibe edecek -i).


Harika cevap, teşekkürler! Not Bazı dosya sistemleri (örneğin, CIFS) mv'nin -fkullanılmamış olsa bile bayrak kullanılmış gibi davranması gibi beklenmeyen davranışlar göstermesine (örn. Kılavuzdan farklı) neden olabilir .
sampablokuper

Birçok uygulamanın sadece etkileşimli bir terminalde ( isatty(0)) göründüğü takdirde onay istediğini kaydetmeye değer . Ayrıca, daha sonraları -fgeçersiz kıldığı doğru -iolsa da, bunun hiçbir argümanla aynı olmadığı anlamına gelmeyebilir.
phk

15

mvAklı başında bir varsayılanın yürütülmesini ayarladığınızda kullanışlıdır :

alias mv="mv -i"

Daha sonra bir hareketi zorlamak istediğinizde bu işe yarar:

mv -f

Zenginleştirilmiş komuttaki önemli olan son seçenek:

mv -i -f

Bu nokta aynı zamanda GNU Coreutils kılavuzunda da belirtilmiştir .


1
Teşekkürler, ama şimdi soruya eklediğim nedenlerden dolayı, geçersiz kılmanın alias mv="mv -i"varlığının sebebi olması muhtemel görünmüyor -f.
sampablokuper

12
Varsayılanı "istenildiği gibi yapın, aptal soru yok" davranışına mv(1)(ve diğer Unix komutlarına) "delirdiğin" gibi ima
etmeye itiraz ediyorum

1
vonbrand, Linux / UNIX komutlarının doğrudan cevap vermemesini takdir ederken -i, komut satırını birkaç yıldan fazla bir süredir kullanan mvbirinin bir noktada ya da başka bir yerde yakıldığına inanıyorum .
Alexander,

1
Geçersiz kılmanın -i ihtimalinin düşük olduğunu düşünebilirsiniz, ancak bu yüzden -f'nin böyle kullanıldığını tahmin ediyorum.
Walter

11

Var çünkü ( man mv)

Eğer birden fazla belirtirseniz -i, -f, -n, sadece son bir etkili olur.

Böylece, her zaman soran bir script / alias / fonksiyonuna sahip olabilirsiniz, fakat yine de seçeneği geçersiz kılabilirsiniz.

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"

Anlamlı bir işlev / komut dosyası elbette daha fazlasını yapar (örneğin eylemi günlüğe kaydetme).


@choroba Teşekkürler, ama şimdi soruya ekledim nedenlerden dolayı alias mv="mv -i", varlığın nedeni gibi geçersiz kılma diğer adları geçersiz görünüyor -f. Yine de senaryolardan ve fonksiyonlardan bahsettiniz. Lütfen bu ikisini kullanarak örnekler verebilir misiniz?
sampablokuper

@sampablokuper: güncellendi.
choroba,

@choroba, tekrar teşekkürler. Ne yazık ki, ne işlev örneğiniz ne de senaryo örneğiniz kullanılmıyor mv -f, bu yüzden hala varlığını nasıl haklı çıkardığı / açıkladığına dair net değil. Açıkça eksik olduğum için üzgünüm!
sampablokuper

@sampablokuper: Hepsi kullanıyor mv -i. Onları kullanmak, ancak etkileşimi atlamak istiyorsan, MV -fvb.
Kullanırsın

1
davranışıyla @sampablokuper mvbu seçeneklerden herhangi olmadan etmektir bazen sormak bu arasında açık bir fark olacağını bu yüzden, (hedef değil yazılabilir ve interaktif terminali) mv -fve \mv.
phk

5

mvFarklı kendi kutu işlevini komut -fseçeneği, ki bunun bir istem olmadan yazma yazma korumalı dosyaları çalışacaktır.

user2@host:location> ls -l ./
drwxrwxr-x 2 user1 users    10   Oct 16 12:58 dir
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user1 users     0   Oct 16 12:58 file1
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file2
user2@host:location> \mv ./dir/file2 ./dir/file1
'mv' try to overwrite './dir/file1', overridding mode 0644 (rw-r--r--)? n
user2@host:location> \mv -f ./dir/file2 ./dir/file1
user2@host:location> ls -l ./dir/
-rw-r--r-- 2 user2 users     0   Oct 16 12:58 file1

User2 dizinindeki yazma izinleri nedeniyle user1 dosyalarının üzerine yazabilir ./dir/, ancak bunu yapmadan önce uyarılır. -fuyarıyı önler.


-1

Kabuk programlamasında, -f kullanımı, komutlarınızın hatalarla sonlandırılmadığından emin olmak için kullanılan ortak bir deyimdir veya komutlardan / kullanıcıdan bazı komutları çalıştırırken etkileşimli yanıt vermelerini isteyin. İstediğiniz en son şey, komut dosyanızın kullanıcı girişi için beklemeyi duraklatması veya yanlış komutun girişi standart olarak alması için belki de daha kötüsü.

Not: Bir diğer adı geri almak yan etkilere neden olabilir / kaldırabilir. Komutu başka bir sürüme taktıysanız veya ek seçeneklerle taktıysanız, takma adı geri almak istenmeyen yan etkilere neden olur. Örneğin, geri dönüşüm kutusu (veya diğer koruma / izleme sistemleri) kullanmak için takma ad mv ve rm ile olabilir. Takma adı geri almak bunu kıracak ...


Nitpick: -fcp veya mv seçeneği "çalıştıklarını" garanti etmez. Örneğin, izin yetersizse, -f komutu çalışmasını sağlamaz. Demek istediğin, -f'nin istemeye gerek kalmadan üzerine yazmaya zorlamasıdır. Karşıt bayrak -i, üzerine yazmak için etkileşimli gerektirir.
Eric Leschinski,

Dikkat edilmesi gereken iki şey: 1.) Uygulamalar normalde etkileşimli bir terminalde ( isatty(0)) olup olmadığınızı test eder , bu nedenle, örneğin betiğiniz bir borunun parçası olarak çalışıyorsa tetiklenmez. 2.) Eklemek -fgeri alma ile aynı değildir, -içünkü mv -i -ffarklıdır mv, Mark'ın cevabına bakınız .
phk
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.