Рекурсивно додайте файл до всіх підкаталогів


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/на кожному з них.


або, знайдіть. -типу d -exec сенсорний файл {} \;
ChuckCottrill

1
або,find . -type d -exec touch {}/file\;
Ned64

6

Якщо ви просто хочете створити порожній файл, ви можете використовувати touchі глобул оболонки. В zsh:

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

В bash:

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

В bash:

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

Портативно:

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 до відповіді тердоном НЕ працює, оскільки це буде лише touchфайл, який називається $ name в поточному каталозі, і сам каталог.

Він не створюватиме файли в підкаталогах, як цього вимагає ОП, тоді як ця версія тут буде.


0

Щоб на самому ділі просто створити файл, ви можете використовувати touchз find:

$ find . -type d -exec touch {}/file \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.