คัดลอกโฟลเดอร์เท่านั้นไม่ใช่ไฟล์?


16

มีวิธีการคัดลอกไดเรกทอรีทั้งหมด แต่เฉพาะโฟลเดอร์หรือไม่ ฉันมีไฟล์ที่เสียหายในไดเรกทอรีของฉันซึ่งทำให้ฮาร์ดดิสก์ของฉันล้มเหลว

ดังนั้นแทนที่จะคัดลอกไฟล์ที่เสียหายไปยังฮาร์ดดิสก์อื่นฉันต้องการคัดลอกโฟลเดอร์เพราะฉันมีสคริปต์ที่ค้นหาหลายร้อยโฟลเดอร์และฉันไม่ต้องการสร้างด้วยตนเองทั้งหมด

ฉันค้นหาคู่มือ cp แต่ไม่เห็นอะไรเลย (ฉันอาจจะพลาด)

ว่าฉันมีโครงสร้างนี้ใน HDD ที่ล้มเหลวของฉัน:

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

สิ่งที่ฉันต้องการคือโครงสร้างไดเรกทอรีไม่ใช่ไฟล์ใด ๆ เลย

ดังนั้นฉันจะลงเอยด้วย HDD ใหม่:

dir1
    dir2
        dir4
dir3

หวังว่าใครบางคนรู้เทคนิคบางอย่าง!


คุณหมายถึงคุณต้องการเพียงแค่คัดลอกโครงสร้างไดเรกทอรีหรือคุณหมายถึงคุณต้องการแยกไฟล์ในไดเรกทอรีการทำงานปัจจุบัน (และไฟล์อื่น ๆ ทั้งหมดในไดเรกทอรีย่อยลึกเป็นเกม)
Oli

ฉันได้เพิ่มตัวอย่าง ขออภัยที่ทำให้สับสน
แชนนอน

1
FYI ใช้rsyncเพื่อคัดลอกโครงสร้างไดเรกทอรีและรักษาสิทธิ์และคุณลักษณะ] ( stackoverflow.com/a/9242883/52074 ) ใช้ธรรมดาไม่รักษาสิทธิ์และคุณลักษณะmkdir -p
เทรเวอร์บอยด์สมิ ธ

คำตอบ:


15

หากคุณต้องการทำมิเรอร์โครงกระดูกไดเรกทอรีและคัดลอกไฟล์ไม่:

find -type d -links 2 -exec mkdir -p "/path/to/backup/{}" \;

เกิดอะไรขึ้นที่นี่:

  • ค้นหาเป็นการเลือกไดเรกทอรีเท่านั้น
  • เรากำลังใช้-links 2เพื่อหาสิ่งที่ไดเรกทอรีที่ลึกที่สุดที่เป็นไปได้
  • mkdir -p จะทำให้ไดเรกทอรีที่ขาดหายไปพร้อมกัน

ฉันทำแบบนี้มากกว่าfind -type d -exec mkdir -p "/path/to/backup/{}" \;เพราะมันจะตัดการmkdirโทรทั้งหมด เราสามารถพิสูจน์ได้อย่างรวดเร็วด้วยการทดสอบเล็กน้อย นี่คือแผนภูมิทดสอบตามด้วยสิ่งที่ฉันวิ่งไปเปรียบเทียบทั้งสองคำสั่ง:

$ tree
.
├── dir1
│   ├── dir2
│   │   └── dir3
│   ├── dir7
│   └── dir8
└── dir9
    └── dir0

$ pr -m -t <(find -type d) <(find -type d -links 2)
.                               ./dir1/dir8
./dir1                          ./dir1/dir2/dir3
./dir1/dir8                     ./dir1/dir7
./dir1/dir2                     ./dir9/dir0
./dir1/dir2/dir3
./dir1/dir7
./dir9                  
./dir9/dir0 

และนั่นจะทำให้ดีขึ้นในโซลูชันคำศัพท์จริงที่มีไดเรกทอรีนับพัน


นี่คือฉันเป็น noob แต่คุณจะค้นหาสำเนาเก่าเพื่อคัดลอกไปยังการสำรองข้อมูลได้อย่างไร ฉันเห็นเพียงเส้นทางเดียวที่นี่
แชนนอน

หากคุณไม่ได้ระบุเส้นทางให้findใช้ไดเรกทอรีการทำงานปัจจุบันเป็นจุดเริ่มต้น หากคุณต้องการใช้เส้นทางอื่นให้ใช้ไวยากรณ์:find /path/to/search/ -type.....
Oli

ดังนั้นฉันตั้งไดเรกทอรีของฉันไปยังโฟลเดอร์ที่มีโครงกระดูกที่ฉันต้องการคัดลอกเรียกใช้find -type d -exec mkdir -p "/media/jinglez/TVSeries/TV Series"/{}" \;และทั้งหมดควรจะโอเค? ดูเหมือนว่าจะใช้เวลาสักครู่: /
แชนนอน

ฉันเรียกใช้จากเทอร์มินัลปกติใช่ไหม
แชนนอน

1
ทั้งคู่มีความเฉพาะเจาะจงในการค้นหาส่วนคำสั่ง exec {} หมายถึงชื่อไฟล์ "พบ" ในปัจจุบันและ \; เป็นเพียงการหลบหนีเพื่อจบประโยค จากลักษณะของมันมีพิเศษ "ในรหัสของคุณไม่ดีฉันแน่ใจว่า ... ควรอ่าน:find -type d -links 2 -exec mkdir -p "/media/jinglez/TVSeries/TV Series/{}" \;
Oli

2

ทำได้ค่อนข้างง่ายด้วย python หนึ่งซับใน:

bash-4.3$ tree
.
├── ABC
├── set_pathname_icon.py
├── subdir1
│   ├── file1.abc
│   └── file2.abc
├── subdir2
│   ├── file1.abc
│   └── file2.abc
└── subdir3
    └── subdir4
        └── file1.txt

4 directories, 7 files
bash-4.3$ python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination
bash-4.3$ tree ~/new_destination
/home/xieerqi/new_destination
├── subdir1
├── subdir2
└── subdir3
    └── subdir4

ในฐานะที่เป็นสคริปต์นี้สามารถเขียนใหม่เช่น:

#!/usr/bin/env python
import os,sys
dirs=[ r for r,s,f in os.walk(".") if r != "."]
for i in dirs:
    os.makedirs(os.path.join(sys.argv[1],i)) 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.