Pindahkan semua file dari subdirektori ke direktori saat ini?

13

Bagaimana saya bisa memindahkan file yang terdapat di semua subdirektori ke direktori saat ini, dan kemudian menghapus subdirektori kosong?

Saya menemukan pertanyaan ini , tetapi mengadaptasi jawaban untuk:

mv * .

tidak bekerja; Saya menerima banyak peringatan seperti:

mv: wil and ./wil are identical

File yang terkandung dalam subdirektori memiliki nama unik.

Richard
sumber

Jawaban:

22

Anda juga dapat menggunakan -mindepthopsi:

find . -type f -mindepth 2 -exec mv -i -- {} . \;

(Bersama dengan -maxdepthAnda juga dapat membatasi level hierarki untuk mengumpulkan file.)

Saya menggunakan mv -i("interaktif") untuk mvbertanya sebelum menimpa file. Dengan banyak subdirektori, mungkin ada bentrokan nama yang ingin Anda peringatkan.

The --pilihan berhenti pengolahan pilihan, sehingga mvtidak bingung dengan nama file dimulai dengan tanda hubung.

Bersihkan sejumlah besar subdirektori kosong dengan

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Florian Jenn
sumber
Apakah ada cara untuk melewatkan pertanyaan tentang menimpa file dengan tidak menimpanya?
Filnor
2
Opsi untuk mv:: -n, --no-clobberjangan menimpa file yang ada. Anda mungkin tertarik -b, --backupjuga.
Florian Jenn
5

Coba ini:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

More Info: Coba temukan-stamement saja, itu akan memberi Anda daftar dengan semua file yang ingin Anda pindahkan (biarkan keluar -print0). Contoh:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

dengan -print0dan xargsAnda sekarang membuat daftar pernyataan untuk dieksekusi. The -J %berarti bendera, insert daftar elemen di sini, jadi mv $FILE .dijalankan untuk setiap file yang ditemukan.

Di atas berfungsi untuk xargs BSD. Jika Anda menggunakan versi GNU (Linux) -I %alih-alih-J %

trurl
sumber
0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
ata
sumber
-2

1 trik cepat, hanya berfungsi jika file Anda memiliki ekstensi (dengan titik):

mv *.* subdir/
mv .* subdir/
Guillermo
sumber
-2

Jalankan saja perintah ini :-)

mv **/*.* .

Paul Digi
sumber
1
Itu tidak akan menemukan file yang tidak memiliki .dalam nama mereka, bukan?
G-Man Mengatakan 'Reinstate Monica'