Đệ quy thêm một tệp vào tất cả các thư mục con


13

Làm cách nào để tôi đệ quy (hoặc chạm) một tệp vào thư mục hiện tại, cũng như tất cả các thư mục con?

Ví dụ,
tôi muốn chuyển cây thư mục này:

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

vào

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

9 directories, 10 files

Câu trả lời:


14

Làm thế nào về:

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

Từ 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

Vì vậy, lệnh trên sẽ tìm thấy tất cả các thư mục và chạy cp file DIR_NAME/trên mỗi thư mục.


hoặc, tìm. -type d -exec tập tin cảm ứng {} \;
ChuckCottrill

1
hoặc,find . -type d -exec touch {}/file\;
Ned64

5

Nếu bạn chỉ muốn tạo một tệp trống, bạn có thể sử dụng touchvà shell shell. Trong zsh:

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

Trong bash:

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

Có thể sử dụng find:

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

Một số findtriển khai, nhưng không phải tất cả, cho phép bạn viếtfind . -type d -exec touch {}/file \;

Nếu bạn muốn sao chép một số nội dung tham khảo, thì bạn sẽ phải gọi findtrong một vòng lặp. Trong zsh:

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

Trong bash:

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

Có thể:

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

2

Khi muốn touchcác tệp được gọi là $ name trong thư mục hiện tại và trong tất cả các thư mục con, điều này sẽ hoạt động:

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

Lưu ý rằng nhận xét của ChuckCottrill đối với câu trả lời của terdon KHÔNG hoạt động, vì nó sẽ chỉ có touchtệp có tên $ name trong thư mục hiện tại và chính thư mục đó.

Nó sẽ không tạo các tệp trong thư mục con theo yêu cầu của OP, trong khi phiên bản này ở đây sẽ.


0

Để thực sự chỉ cần tạo một tệp, bạn có thể sử dụng touchvới find:

$ find . -type d -exec touch {}/file \;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.