Windows Komut İsteminde, yalnızca tam yolu ve dosya boyutunu sürekli olarak gösteren dosyaları listeleme


50

Dosya adını (tam yol dahil) ve belirli bir dizindeki ve alt dizinlerinin herhangi birinde (yani yinelemeli olarak) tüm dosyalar için dosya boyutunu içeren bir metin dosyası oluşturmaya çalışıyorum. İdeal olarak, dosya boyutunda virgül istemiyorum (ancak onlar için yerleşeceğim!)

Aşağıdaki komut bunu yapar ancak dosya boyutu olmadan:

dir /b /s /a:-D > results.txt

Örnek bir çıktı şöyle görünür:

C:\Users\Martin\Pictures\Table\original\PC120013.JPG  227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG  123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG  932344

dirYanlış olduğunu ispat etmeyi sevdiğim halde, bunun tek başına kullanılmasının mümkün olduğunu sanmıyorum . Bunu yalnızca Komut İsteminde bulunabilecek komutları kullanarak yapmanın başka bir yolu var mı?

Yanıtlar:


28

Bu yapmalı:

@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

Çok verimli değil ... tonlarca dosya içeren klasörler için çalıştırma işlemi kabataslak olabilir, bu nedenle önce küçük klasörlerde deneyin.

"İçin /?" yardım metni ('I' yerine 'a' kullandım)

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

The modifiers can be combined to get compound results:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

6
Bunu kullanarak küçük bir bağlantıya çarptım: dosya adındaki boşluklu dosyalar doğru şekilde kaydedilmedi. Bunu düzeltmek için "tokens=*"şöyle bir ekledim@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
Don Vince

Bir txtdosyaya nasıl yazdırılır ?
Saeed Neamati

3
Olması gerekenfor /r %a in (*) do echo %~fa %~za
ZAB

1
@Saeed Neamati - İşte bir örnek >> C:\Temp\VideoList.txtne olursa olsun süreç öncesinde adında bir metin dosyasına dışarı yazılır geldi sonuçları - VideoList . One > kullanmak , dosyanın üzerine yazar ( zaten varsa ) ve >> kullanılarak metin dosyası ( eğer varsa ) sonuna yeni sonuçlar ekler . Metin dosyası henüz mevcut değilse, bu komut belirtilen ada sahip yeni bir dosya yazar.
user23715

bu bana * .dwg dosyalarının bir listesini verdi, dosya boyutunu bir metin dosyasına @echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
CAD,

14

Alternatif # 1: FOR / R benim için # 2'den daha sezgisel.
Alternatif # 2: FOR / F BrianAdkins'in önerisindeki sorunu "isimlerdeki boşluklar" ile düzeltir.
Alternatif # 3: FORFILES, yolun çift tırnak içinde olması dışında benim seçimim olur.

Brian veya diğer gurular daha zarif bir çözüme sahip olabilir veya bu üç iş dışında bir düzine başka çözüm önerebilirler. FOR TOENS kullanmaya çalıştım ancak daha sonra başlıkları ve altlıkları şeritlemek zorunda kaldım. Ayrıca küçük bir .bat dosyası oluşturmayı ve onu çağırmayı da düşündüm, ancak bu başka bir dosya ekliyor (bir işlevde olduğu gibi daha fazla esneklik sağlamasına rağmen).

Tüm alternatifleri gömülü boşluklara sahip dizin ve dosya isimleri, 200+ karakterli dosya adı, uzantısız dosya adı ve küçük bir sürücünün kökü üzerinde test ettim (sadece zaman için; biraz yavaş - tıpkı Brian'ın önerdiği gibi) - ama sonra Windows Gezgini'nde arama yapıyor, bu yüzden her şeyi arama uygulamasını yükledim).

Alternatif # 1: FOR / R

En iyisi (?) Brian'ın çözümünün neden benim için işe yaramadığını anlamaya çalışırken YARDIM FORMU'na baktım ve / R yaklaşımını denemeye karar verdim. (Bir dosya oluşturmak Alternatif # 2 ile aynı olacaktır.)

@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA

Örnek - İşler (yinelemeyi göstermek için yukarıdakinden farklı bir dizin)

@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

Alternatif # 2: FOR / F

BrianAdkins'in önerdiği: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

Bir düzeltilmiş cevap geçerli:

@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA 

Bir daha eksiksiz dizinleri ile cevap bastırılmış ve bir dosyaya çıkışı (eklenen) 'dir:

@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt

Not: "delims = *", dosya adlarında izin verilmeyen bir karakter belirtir.
Not: 2nd komutu ayrıca / a: -d ile dizinleri de gizler.
Not: Birisi farklı değişken isimleri seçerse, değişken ve değişken parametreleri arasındaki farkı açıklığa kavuşturmak için FOR değişken ismi büyük harfle yapılır.
Not: OP bir dosyanın çıktısını istediği için sırıtış için dosyaya eklenir.

Sanırım gerçekten ECHO'nun durumunu kontrol etmeli ve aynı zamanda sıfırlamalıyım.

Sayı - İsimlerdeki Uzaylar

Brian'ın önerdiği çözüm, boşluk içeren dosya ve klasör adlarını işlemez (en azından Vista yapılandırmamda değil).

Örnek - Yanlış (Kesintisiz; OP başına dizinin bastırılmasını içerir ancak vurgu için hem dosya adından önce ve sonra hem de boyutta)

Kesilmiş Ad ve Boyut (6 dosyadan 4'ü yanlış):

@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
 C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
 C:\DeleteLater\Folder
 C:\DeleteLater\Folder
 C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

Örnek - Doğru (Ekrana not çıkışı, dosyaya eklenmemiş)

@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

Alternatif # 3: FORFİLLER (Alıntı Sayı)

Bu çözüm, FORFILES belgesindeki ( forfiles /?) son iki örnekten doğrudan sonuç almaktadır .

FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

Bu örnekleri birleştirmek ve bir dosyaya yazmak cevap verir (neredeyse):

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt

Yolun çıktıda tırnak içinde olduğunu unutmayın.
Farketmez echo onya echo offkonum değiştirir.
Her dizini ayıran boş bir satır eklemek, IF'nin önemsiz bir uzantısı olacaktır.

Dikkat : Maskeyi kullanmak,/m *.*uzantı olmadan dosyaları döndürmez (örn. Son dosya gibi)!

Bir yana : Bu, her dizine sadece bu dizinin içeriğini içeren bir dosya yazar:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"OP'nin istediği şeyi değil, bazen kullanışlı.

Örnek - Çalışır (ancak tırnak içinde tam yolla)

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize"

"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0

Bu örnek, çok uzun bir dosya adı olan bir dosya dizini ve uzantısız bir dosya adı içerir.

Sorun: Tırnaklardaki Yol

Öyleyse, OP örneği başına istenmeyen (?) Tırnak işaretlerini kaldırmanın ve Alternatif # 3: FORFILES'i kaydetmenin kolay bir yolu var mı? (Retorik soru: Alıntılar bir özellik mi, bir kusur mu?)



1
powershell "dir | select name,length"

Bu OP'nin sorusunu aldatıyor olabilir. Ancak, soru artık modern Windows tabanlı sistemler ile ilgili değildir. Dir diğer adı, mantıksal bağlantının çizilmesine yardımcı olmak için kullanıldı.


2
Bunu denedim (Windows 7). Çalıştırılması 30 saniye sürdü (20 girişli bir dizinde) ve alt dizinlere inmedi.
Scott

Özyineleme yapmak için lütfen powershell "Get-ChildItem -Recurse| select name,length"
öğelere

0

Aşağıda, bir ağ sürücüsünde çok fazla yer kaplayan çeşitli video dosyalarını bulmak ve sonuçları yerel bir bilgisayardaki bir metin dosyasına yazmak için kullandıklarım yer almaktadır.

Üç nedenden dolayı kendime biraz geç cevap veriyorum. Birincisi, özlü cevapları severim. İkincisi, bu tek komut dosyası satırı, bir ağda dahil olmak üzere benim için birden çok ayarda çalıştı. Üçü, Don Vince'in BrianAdkins'in cevabı altındaki potansiyel olarak belirsiz yorumuna göre, belirteçleri kullanmak, dosya adlarındaki sorunları kendi içlerinde boşluk bırakarak atlayabilir.

for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt

Çok uzun dosya yollarının / dosya adlarının (yüzlerce karakter) de hatalara yol açabileceğini, ancak aramanın bunlara dayanmayacağını fark ettim. Ancak, hedef (ler) iniz için tam olarak keşfedilmemiş kalır. Bir kez not edildiğinde, bu hatayı gidermek için klasör yapısını daha derinden başlayarak telafi edebilirsiniz.

Bu sayfa ss64 , dir komutunun kullanımı, tüm anahtarların listelenmesi, birçok anahtar kombinasyonunun listelenmesi ve uygun sözdiziminin yararlı örneklerinin gösterilmesi hakkında çok iyi bir sunum sunar . Çeşitli Stack Exchange toplulukları kadar kapsamlı değildir, ancak komut satırı / toplu komut dosyası oluşturma ile rahatladığınızda sunumda kesin bir netlik vardır.


0

Buna şu komutla ulaştım:

(for /R "\path\to\directory\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"

Sonuç:

D:\Users\Natasha>(for /R ".\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"


D:\Users\Natasha\Flowers_ (12).jpg 118886

D:\Users\Natasha\SomeFolder\data.txt 1241

D:\Users\Natasha\SomeFolder\CS\Counter-Strike_1.6.exe 272645624

Not Bu, BillR (Alternatif # 1) tarafından verilen cevaba dayanmaktadır. Ancak benim durumumda ile asılı @echo off.


0

"Du" komutunu oldukça faydalı buluyorum ve hem Windows hem de Unix üzerinde çalışıyor (Windows PC'den bir Linux Web Sunucusuna çok fazla veri aktarırken tüm dosyaların kopyalanıp kopyalanmadığını kontrol etmek için kullandım):

du -ah "C:\your_dir" > "C:\file_list.txt"

çıktılar:

15  C:\your_dir/.htaccess
608 C:\your_dir/folder/hello.txt
1.0 C:\your_dir/folder/subfolder/test.txt
1.0 C:\your_dir/folder/subfolder
1.2M    C:\your_dir/folder/world.txt
1.2M    C:\your_dir/folder
9.0 C:\your_dir/no_file_ending
11  C:\your_dir/sample document 1.txt
684K    C:\your_dir/sample document 2 - äöüßÄÖÜáà.txt
1.9M    C:\your_dir

Ancak, özel karakterleri Notepad ++ 'da değil Notepad'de doğru bir şekilde görebildim (şu anda tam olarak analiz etmek için zaman yok), bazı ANSI / UTF-8 Kodlama şeyleri olmalı). Ayrıca dosya adından sonra boyutu görüntülemek için bir çözüm bulamadım. Boyutu bayt veya kilobayt olarak görüntülemek için "h" yerine "b" veya "k" seçeneklerini kullanın. Komutu analiz etmek istediğim klasörün dışında çalıştırırken biraz sorun yaşadım. Bu yüzden en iyisi komutu doğru dizine (bu örnekte "C: \ your_dir") girin ve komutta belirtin.


-1

B dir / b / s / a: -D> results.txt dosyasında atlayın ve sonuçlar şöyle görünmelidir (örn. Dir / s / a: -D> results.txt):

H sürücüsündeki ses seviyesi FILES Ses Seri Numarası C9EB-112E

H dizini: \ Files

09.09.2014 23:36 0 testing.txt 1 Dosya (lar) 0 bayt

H dizini: \ Video \ Action \ Comix

10.06.2012 09:51 AM 184.740 dosya1.txt 07/20/2012 06:21 AM
864,832 dosya2.txt 08/31/2009 08:47 PM 606,638 dosya3.txt 08/31/2009 09:07 PM 160,320 dosya4 .Txt


Bu asıl sorunun cevabı değil . OP'nin istediği çıktıyı üretmez.
DavidPostill

-1
where * /t  

Aşırı karmaşık olmadan, bu istenen sonucu vermelidir. OP'nin istediğinden biraz daha fazlasını verecek, ancak bahsetmeye değer olduğunu düşündüm. Geçerli olmayan bir dizin belirtmek için / R anahtarını ekleyin.


1
Yanıtınızı denediğim ve çalıştığım gibi çalıştığım bir hata mesajı aldıkça güncelleme ve onaylamayı düşünün, ERROR: Invalid syntax. Value expected for '/r'bu nedenle çizim tahtasına geri dönmeyi ve doğru sözdizimini sağlamayı ve cevabınızı doğru ayrıntıyla düzenlemeyi düşünün .
Pezevenk Suyu BT

Değerini girmeyi düşünün ... / R, dizin anahtarıdır, dışarıda bıraktığınızda varsayılanı geçerli dizine çevirir.
someguy

“OP'nin istediğinden biraz daha fazlasını verecek”. Dalgamı geçiyorsun?  where /?“Varsayılan olarak, arama geçerli dizin boyunca ve PATH ortam değişkeni tarafından belirtilen yollarda yapılır . ”- yani where * /tkomutunuz her dosyayı C:\Windows\System32, bazı alt dizinlerini C:\Program Filesve içindeki diğer dizinleri listeler PATH. Benim için bu 3000 çizgiden fazlaydı. Lütfen makul olması için cevabınızı düzenlemeyi düşünün. PS Olmadan  /R, özyinelemeli değildir.
Scott

NEREDE / R *. * benim için çalıştı. / R. belirtilen konumdan özyinelemeli olarak arama yapmayı söylüyor (bu durumda geçerli dizini). *. * Eşleşecek modeldir. NEREDE / R% USERPROFILE% * .docx tüm kelime dosyalarını kullanıcının klasöründe gösterir. (Bu yorumlarda \ ile birlikte * ile kaçış)
DHW
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.