Daftar file secara rekursif hanya menampilkan path lengkap dan ukuran file dari Windows Command Prompt

51

Saya mencoba untuk menghasilkan file teks yang berisi nama file (termasuk path lengkap) dan ukuran file untuk semua file dalam direktori tertentu dan salah satu sub-direktori (yaitu secara rekursif). Idealnya, saya tidak ingin koma dalam ukuran file (tapi saya akan puas dengan mereka!)

Perintah berikut melakukannya tetapi tanpa ukuran file:

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

Contoh output akan terlihat seperti:

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

Saya tidak berpikir ini mungkin menggunakan dirsendirian, meskipun saya ingin terbukti salah. Apakah ada cara lain untuk melakukan ini, hanya menggunakan perintah yang tersedia dari Command Prompt?

Martin Wilson
sumber

Jawaban:

28

Ini harus dilakukan:

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

Ini tidak terlalu efisien ... menjalankannya untuk folder yang berisi banyak file mungkin tidak jelas, jadi cobalah dulu pada folder kecil.

Dari "untuk /?" teks bantuan (saya menggunakan 'a' bukan 'saya')

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
Brian Adkins
sumber
6
Saya mendapatkan hambatan kecil menggunakan ini: file dengan spasi di nama file tidak mendaftar dengan benar. Untuk memperbaikinya saya menambahkan "tokens=*"sebagai berikut@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
Don Vince
Bagaimana cara mencetaknya ke txtfile?
Saeed Neamati
3
Seharusnyafor /r %a in (*) do echo %~fa %~za
ZAB
1
@Saeed Neamati - Berikut ini adalah contoh >> C:\Temp\VideoList.txt- Hasil dari proses apa pun yang datang sebelumnya dituliskan ke file teks bernama VideoList . Menggunakan satu > akan menimpa file ( jika sudah ada ) dan menggunakan >> akan menambahkan hasil baru pada akhirnya jika file teks ( jika sudah ada ). Jika file teks belum ada, perintah ini menulis file baru dengan nama yang ditentukan.
user23715
ini memberi saya daftar file * .dwg, tanpa ukuran file, ke file teks:@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
CAD bloke
15

Alternatif # 1: FOR / R lebih intuitif daripada # 2 untuk saya.
Alternatif # 2: FOR / F memperbaiki masalah dengan "spasi dalam nama" dalam saran BrianAdkins.
Alternatif # 3: FORFILES akan menjadi pilihanku kecuali bahwa jalannya berada dalam tanda kutip ganda.

Brian atau guru lain mungkin memiliki solusi yang lebih elegan atau mungkin dapat menyarankan selusin solusi lain tetapi tiga ini berhasil. Saya mencoba menggunakan FOR TOKENS tetapi kemudian harus menghapus header dan footer jadi saya kembali ke # 1. Saya juga mempertimbangkan untuk membuat file .bat kecil dan memanggilnya tetapi itu menambahkan file lain (meskipun itu memberikan fleksibilitas yang lebih besar, seperti fungsi).

Saya menguji semua alternatif dengan direktori dan nama file dengan ruang yang disematkan, nama file 200+ karakter, nama file tanpa ekstensi, dan pada root drive kecil (hanya untuk waktu; agak lambat - seperti yang disarankan Brian - tapi kemudian jadi sedang mencari di Windows Explorer, itu sebabnya saya menginstal aplikasi pencarian Semuanya).

Alternatif # 1: UNTUK / R

Terbaik (?) Ketika mencoba mencari tahu mengapa solusi Brian tidak berhasil bagi saya, saya melihat BANTUAN UNTUK dan memutuskan untuk mencoba pendekatan / R. (Membuat file akan sama dengan di Alternatif # 2.)

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

Contoh - Bekerja (direktori berbeda dari yang di atas untuk menunjukkan rekursi)

@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: UNTUK / F

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

Sebuah jawaban yang dikoreksi adalah:

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

Jawaban yang lebih lengkap dengan direktori yang ditekan dan keluaran (ditambahkan) ke sebuah file adalah:

@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

Catatan: "delims = *" menentukan karakter yang tidak diizinkan dalam nama file.
Catatan: Perintah ke-2 juga menekan direktori melalui / a: -d.
Catatan: Buat huruf besar nama variabel FOR untuk memperjelas perbedaan antara variabel dan parameter variabel jika seseorang memilih nama variabel yang berbeda.
Catatan: Tambahkan ke file hanya untuk senyum ketika OP meminta output ke file.

Saya kira saya harus benar-benar memeriksa status ECHO dan meresetnya juga.

Masalah - Spaces in Names

Solusi yang diajukan Brian tidak menangani nama file dan folder yang berisi spasi (setidaknya tidak pada konfigurasi Vista saya).

Contoh - Salah (Tanpa batas; Termasuk direktori penekan per OP tetapi dengan ukuran sebelum dan sesudah nama file untuk penekanan)

Nama dan Ukuran Terpotong (4 dari 6 file salah):

@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

Contoh - Benar (Catatan keluaran ke layar, tidak ditambahkan ke file)

@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: FORFILES (Masalah Kutipan)

Solusi ini langsung dari dua contoh terakhir dalam dokumentasi FORFILES ( forfiles /?).

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

Menggabungkan contoh-contoh ini dan menulis ke file menghasilkan jawaban (hampir):

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

Perhatikan bahwa path dalam tanda kutip di output.
Tidak masalah apakah echo onatau echo offtidak diaktifkan.
Menambahkan baris kosong yang memisahkan setiap direktori akan menjadi ekstensi sepele dari IF.

Perhatian : Menggunakan topeng/m *.*tidak akan mengembalikan file tanpa ekstensi (seperti file terakhir misalnya)!

Selain itu : Ini menulis file di setiap direktori dengan isi hanya direktori itu:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"Bukan apa yang diinginkan OP tetapi kadang-kadang berguna.

Contoh - Bekerja (tetapi dengan kutipan penuh)

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

Contoh ini termasuk direktori tambahan dengan nama file super panjang dan nama file tanpa ekstensi.

Masalah: Path in Quotes

Jadi, adakah cara mudah untuk menghapus kutipan yang tidak diinginkan (?) Per contoh OP dan menyimpan Alternatif # 3: FORFILES. (Pertanyaan retoris: Apakah kutipan fitur atau cacat?)

BillR
sumber
1

Saya menyadari ini membutuhkan utlity ekstra , tetapi Anda dapat mencapai ini dengan cukup ringkas menggunakan utilitas sfk :

sfk cwd +run -yes "sfk list -size -tab $qfile +toclip"

sfk fromclip > C:\_temp\sfk_list_output.txt

(Saya mendapat pendekatan menggunakan chaining perintah sfk di sini )

rogersillito
sumber
1
powershell "dir | select name,length"

Ini mungkin curang pada pertanyaan OP. Namun, pertanyaannya tidak lagi relevan pada sistem berbasis Windows modern. Dir alias digunakan untuk membantu menggambar tautan logis.

beberapa pria
sumber
2
Saya mencoba ini (Windows 7). Butuh lebih dari 30 detik untuk menjalankan (pada direktori dengan 20 entri) dan tidak turun ke subdirektori.
Scott
Untuk mendapatkan rekursi, harap ubah ke: powershell "Get-ChildItem -Recurse| select name,length"
giorgiomugnaini
0

Di bawah ini adalah apa yang saya gunakan untuk mencari file video misc yang mengambil terlalu banyak ruang pada drive jaringan dan menulis hasilnya ke file teks pada PC lokal.

Saya memposting jawaban saya yang agak terlambat karena tiga alasan. Satu, saya suka jawaban singkat. Dua, satu baris skrip ini berfungsi dalam banyak pengaturan untuk saya, termasuk lintas jaringan. Tiga, per komentar Don Vince yang berpotensi mengaburkan di bawah jawaban BrianAdkins, menggunakan token dapat mem-bypass masalah dari nama file dengan spasi di dalamnya.

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

Saya perhatikan bahwa path file / nama file yang sangat panjang (ratusan karakter) juga dapat menyebabkan kesalahan tetapi pencarian tidak akan bergantung pada itu. Namun jalur tetap belum sepenuhnya dieksplorasi untuk target Anda. Setelah dicatat, Anda dapat mengkompensasi dengan mulai lebih dalam ke dalam struktur folder untuk menghilangkan kesalahan ini.

Halaman ss64 ini memiliki presentasi yang sangat baik tentang penggunaan perintah dir , daftar semua sakelar, banyak kombinasi sakelar, dan menunjukkan beberapa contoh sintaks yang tepat. Ini tidak komprehensif seperti berbagai komunitas Stack Exchange tetapi ada kejelasan yang pasti dalam presentasi setelah Anda terbiasa dengan skrip baris perintah / batch.

pengguna23715
sumber
0

Saya telah mencapai ini dengan perintah berikut:

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

Hasil:

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

PS Ini didasarkan pada balasan oleh BillR (Alternatif # 1). Namun dalam kasus saya hang dengan @echo off.

natasha
sumber
0

Saya menemukan perintah "du" cukup membantu dan bekerja pada Windows dan Unix (menggunakannya untuk memeriksa apakah semua file disalin ketika mentransfer banyak data dari PC Windows ke Linux Web Server):

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

output:

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

Namun, saya hanya dapat dengan benar melihat karakter khusus di Notepad, bukan di Notepad ++ (harus ada beberapa hal Encoding ANSI / UTF-8, tidak ada waktu untuk menganalisis dengan tepat sekarang). Juga saya tidak menemukan solusi untuk menampilkan ukuran setelah nama file. Gunakan opsi "b" atau "k" alih-alih "h" untuk menampilkan ukuran dalam byte atau kilobyte. Saya mengalami beberapa masalah ketika menjalankan perintah di luar folder yang ingin saya analisis. Jadi, sebaiknya masukkan perintah di direktori yang benar ("C: \ your_dir" dalam contoh ini) dan tentukan dalam perintah.

Matthias Luh
sumber
-1

Hapus b dalam dir / b / s / a: -D> results.txt dan hasilnya akan terlihat seperti, (yaitu dir / s / a: -D> results.txt):

Volume dalam drive H adalah FILES Volume Serial Number adalah C9EB-112E

Direktori H: \ File

09/29/2014 11:36 PM 0 testing.txt 1 File 0 byte

Direktori H: \ Video \ Action \ Comix

10/06/2012 09:51 184.740 file1.txt 07/20/2012 06:21
864.832 file2.txt 08/31/2009 08:47 PM 606.638 file3.txt 08/31/2009 09:07 PM 160.320 file4 .txt

xyln
sumber
Ini bukan jawaban untuk pertanyaan awal. Itu tidak menghasilkan output yang dia OP minta.
DavidPostill
-1
where * /t  

Tanpa terlalu rumit, ini akan menghasilkan output yang diinginkan. Ini akan memberikan sedikit lebih banyak daripada yang diminta OP, tapi saya pikir itu layak disebut. Tambahkan / R switch untuk menentukan direktori selain saat ini.

beberapa pria
sumber
1
Pertimbangkan memperbarui dan mengonfirmasi jawaban Anda berfungsi saat saya mencoba dan mendapatkan pesan kesalahan ERROR: Invalid syntax. Value expected for '/r'sehingga pertimbangkan kembali ke papan gambar dan berikan sintaks yang benar dan edit jawaban Anda dengan detail yang benar.
Pimp Juice
Pertimbangkan memasukkan nilai ... / R adalah saklar direktori, default ke direktori saat ini jika Anda membiarkannya.
someguy
"Ini akan memberi sedikit lebih banyak daripada yang diminta OP". Apa Anda sedang bercanda?  where /?mengatakan, "Secara default, pencarian dilakukan di sepanjang direktori saat ini dan di jalur yang ditentukan oleh variabel lingkungan PATH . "- jadi where * /tperintah Anda mencantumkan setiap file di C:\Windows\System32, beberapa subdirektori C:\Program Files, dan setiap direktori lainnya di PATH. Bagi saya, itu lebih dari 3000 baris. Harap pertimbangkan untuk mengedit jawaban Anda agar masuk akal. PS Tanpa  /R, itu tidak rekursif.
Scott
DIMANA / R. *. * bekerja untuk saya. / R. mengatakan untuk mencari secara rekursif dari lokasi yang ditentukan (dalam hal ini direktori saat ini). *. * Adalah pola yang cocok. Jadi WHERE / R% USERPROFILE% * .docx akan menampilkan semua file kata dalam folder pengguna. (Harus melarikan diri * dengan \ dalam komentar ini)
DHW