เพิ่มไฟล์ซ้ำในไดเรกทอรีย่อยทั้งหมด


14

ฉันจะเพิ่ม (หรือแตะ) ไฟล์ซ้ำ ๆ ลงในไดเรกทอรีปัจจุบันรวมถึงไดเรกทอรีย่อยทั้งหมดได้อย่างไร

ตัวอย่างเช่น
ฉันต้องการเปิดไดเรกทอรีต้นไม้นี้:

.
├── 1
   ├── A
   └── B
├── 2
   └── A
└── 3
    ├── A
    └── B
        └── I   
9 directories, 0 files

เข้าไป

.
├── 1
   ├── A
      └── file
   ├── B
      └── file
   └── file
├── 2
   ├── A
      └── file
   └── file
├── 3
   ├── A
      └── file
   ├── B
      ├── file
      └── I
          └── file
   └── file
└── file

9 directories, 10 files

คำตอบ:


14

เกี่ยวกับ:

find . -type d -exec cp file {} \;

จากman find:

   -type c
          File is of type c:
           d      directory

   -exec command ;
          Execute  command;  All following arguments to find are taken 
          to be arguments to the command until an  argument  consisting 
          of `;' is encountered.  The string `{}' is replaced by the 
          current file

ดังนั้นคำสั่งดังกล่าวจะค้นหาไดเรกทอรีทั้งหมดและเรียกใช้cp file DIR_NAME/ในแต่ละของพวกเขา


หรือค้นหา -type d -exec touch file {} \;
ChuckCottrill

1
หรือ,find . -type d -exec touch {}/file\;
Ned64

6

หากคุณเพียงต้องการสร้างไฟล์เปล่าคุณสามารถใช้touchและ shell glob ได้ ใน zsh:

touch **/*(/e:REPLY+=/file:)

ในทุบตี:

shopt -s globstar
for d in **/*/; do touch -- "$d/file"; done

พกพาคุณสามารถใช้find:

find . -type d -exec sh -c 'for d; do touch "$d/file"; done' _ {} +

findการใช้งานบางอย่างแต่ไม่ใช่ทั้งหมดให้คุณเขียนได้find . -type d -exec touch {}/file \;

หากคุณต้องการคัดลอกเนื้อหาอ้างอิงบางส่วนคุณจะต้องโทรfindเป็นลูป ใน zsh:

for d in **/*(/); do cp -p reference_file "$d/file"; done

ในทุบตี:

shopt -s globstar
for d in **/*/; do cp -p reference_file "$d/file"; done

portably:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +

2

เมื่อต้องการtouchไฟล์ที่ชื่อว่า $ name ในไดเรกทอรีปัจจุบันและในทุกไดเรกทอรีย่อยสิ่งนี้จะทำงาน:

find . -type d -exec touch {}/"${name}"  \;

โปรดทราบว่าความคิดเห็นโดย ChuckCottrill ต่อคำตอบของ terdon นั้นใช้ไม่ได้เนื่องจากไฟล์จะมีtouchชื่อว่าชื่อ $ ในไดเรกทอรีปัจจุบันและในไดเรกทอรีเท่านั้น

มันจะไม่สร้างไฟล์ในไดเรกทอรีย่อยตามที่ OP ร้องขอในขณะที่รุ่นนี้จะ


0

หากต้องการสร้างไฟล์จริงๆคุณสามารถใช้touchกับfind:

$ find . -type d -exec touch {}/file \;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.