Как написать текст для каждого пустого файла [закрыто]

Я могу найти пустые файлы в текущем каталоге с:

find . -empty -type f

Я хотел бы знать

Как написать текст в пустые файлы, которые я нашел. Как очистить файлы, если они уже содержат текст.
2
задан 5 August 2017 в 11:20

12 ответов

Как вы попросили решение сделать это, используя xargs:

find -empty | xargs -I files sh -c 'echo hello > $1' -- files

Примечания

Мы запускаем sh, используя xargs при передаче файла имя, которое будет помещено вместо $1, просто $1 - это первый аргумент, который мы передаем сценарию. Используя --, я говорю, что команда sh выполняется здесь, и в конце я передаю имя файла в качестве аргумента в sh.

Тест:

$ mkdir /tmp/lab && cd /tmp/lab
$ touch 1 2 3 && echo foo > 2
$ find -empty
./1
./3

$ find -empty | xargs -I files sh -c 'echo hello > $1' -- files
$ cat 1 2 3
hello
foo
hello
3
ответ дан 22 May 2018 в 19:49
  • 1
    не могли бы вы рассказать эту часть PLS? «sh -c» echo hello & gt; $ @ '- файлы " спасибо @Ravexina – solfish 4 August 2017 в 17:24
  • 2
    Обновлен ответ ... – Ravexina 4 August 2017 в 17:29
  • 3
    действительно спасибо, что я устал от вопросов – solfish 4 August 2017 в 17:33
  • 4
    @solfish, пожалуйста, все в порядке;) снова увидеть мои обновления ... – Ravexina 4 August 2017 в 17:39

Как вы попросили решение сделать это, используя xargs:

find -empty | xargs -I files sh -c 'echo hello > $1' -- files

Примечания

Мы запускаем sh, используя xargs при передаче файла имя, которое будет помещено вместо $1, просто $1 - это первый аргумент, который мы передаем сценарию. Используя --, я говорю, что команда sh выполняется здесь, и в конце я передаю имя файла в качестве аргумента в sh.

Тест:

$ mkdir /tmp/lab && cd /tmp/lab $ touch 1 2 3 && echo foo > 2 $ find -empty ./1 ./3

$ find -empty | xargs -I files sh -c 'echo hello > $1' -- files $ cat 1 2 3 hello foo hello
3
ответ дан 18 July 2018 в 09:04

Как вы попросили решение сделать это, используя xargs:

find -empty | xargs -I files sh -c 'echo hello > $1' -- files

Примечания

Мы запускаем sh, используя xargs при передаче файла имя, которое будет помещено вместо $1, просто $1 - это первый аргумент, который мы передаем сценарию. Используя --, я говорю, что команда sh выполняется здесь, и в конце я передаю имя файла в качестве аргумента в sh.

Тест:

$ mkdir /tmp/lab && cd /tmp/lab $ touch 1 2 3 && echo foo > 2 $ find -empty ./1 ./3

$ find -empty | xargs -I files sh -c 'echo hello > $1' -- files $ cat 1 2 3 hello foo hello
3
ответ дан 24 July 2018 в 19:14

Я считаю, что это должно сработать:

find . -empty -type f -exec bash -c "echo 'hello' >  {}" \; 

Обновить, чтобы найти пустые файлы, а затем записать их, а также найти непустые файлы и их пустые:

find . -type f \( -empty -o -size +0b \) -exec bash -c "if [[ ! -s '{}' ]]; then echo 'hello' > '{}'; else cp /dev/null '{}'; fi" \;

Примечание:

Это выполняется из целевой папки, если нет, то просто добавьте путь к команде так:

find /path/to/folder ...
3
ответ дан 22 May 2018 в 19:49
  • 1
    зачем использовать bash -c там @George? – solfish 4 August 2017 в 17:02
  • 2
    могу ли я использовать xargs? как? – solfish 4 August 2017 в 17:03
  • 3
    См. [F1]: -c If the -c option is present, then commands are read from the first non-option argument command_string. If there are arguments after the command_string, they are assigned to the positional parameters, starting with $0. – George Udosen 4 August 2017 в 17:05

Я не совсем понимаю вопрос, не могли бы вы быть более конкретными? Если вы хотите написать некоторый текст / код в файле, Vim работает очень хорошо.

vim [File Path]

, например

vim /etc/hosts
2
ответ дан 22 May 2018 в 19:49
  • 1
    нет, я не имею в виду это, найдя все пустые файлы, я хотел бы написать все внутри того же скрипта / текста – solfish 4 August 2017 в 16:55

Вы также можете использовать цикл оболочки ...

Сначала, чтобы заставить globbing рекурсивно отражать действие find, включите globstar

shopt -s globstar

Затем найдите файлы

for f in **; do [[ -f "$f" ]] && [[ ! -s "$f" ]] && echo "$f"; done

Вы увидите все пустые файлы. Условие -s в test означает, что файл длиннее 0 байтов. Используя ! -s вы можете найти файлы нулевой длины. -f проверяет, что файл является обычным файлом.

Теперь сделайте небольшую корректировку команды для записи в файлы:

for f in **; do [[ -f "$f" ]] && [[ ! -s "$f" ]] && echo "hello" > "$f"; done

Вы также сказали, что хотите знать, как чтобы очистить файлы, если они не пусты. Самый простой способ удалить файл - это усечь его с перенаправлением

> foo

пуст foo любого содержимого (или создает пустой файл foo, если он не существует). Таким образом, чтобы очистить файлы, содержащие текст (помните, что это уничтожит данные в файлах, убедитесь, что вы используете эту команду в правильном каталоге), вы можете использовать:

for f in **; do [[ -f "$f" ]] && if [[ -s "$f" ]] && > "$f"; done

Вы можете комбинировать две команды для записи в пустые файлы и пустые файлы, содержащие текст:

for f in **; do [[ -f "$f" ]] && if [[ ! -s "$f" ]]; then echo "hello" > "$f"; else > "$f"; fi; done

или более читабельно (помните, что это уничтожит данные в файлах, убедитесь, что вы запуск этой команды в правильном каталоге) :

for f in **; do 
  [[ -f "$f" ]] && if 
    [[ ! -s "$f" ]]; then echo "hello" > "$f"
    else > "$f"
  fi
done

Это означает, что «для всех файлов в этом каталоге и его подкаталогах проверьте, является ли файл обычным файлом, и если он , тогда, если он пуст, напишите в нем «hello», и если он не пуст, то его пуст ».

Вы можете отключить globstar, когда это будет сделано, если хотите (но он все равно будет отменен когда вы запускаете новую оболочку, например, открывая новый терминал, набрав bash или переключая пользователя):

shopt -u globstar
2
ответ дан 22 May 2018 в 19:49
  • 1
    Что такое shopt - u globstar ваше объяснение, какие изменения, если не использовать скрипт @Zanna? – solfish 5 August 2017 в 11:56
  • 2
    он отключает globstar, поэтому globbing с ** больше не распространяется на все файлы, включая подкаталоги & amp; их содержание @solfish – Zanna 5 August 2017 в 11:58
  • 3
    поэтому, если по статусу я могу достигнуть каждого файла, статус выключен, не так ли? – solfish 5 August 2017 в 12:00
  • 4
    это правильно @solfish - вот почему я поставил его в начале моего ответа, так что globbing будет вести себя как find и recurse в подкаталоги – Zanna 5 August 2017 в 12:01
  • 5
    hımm, и это просто полезно с '**', чтобы найти файлы и каталоги, я думаю @Zanna? – solfish 5 August 2017 в 12:03

Я считаю, что это должно сработать:

find . -empty -type f -exec bash -c "echo 'hello' > {}" \;

Обновить, чтобы найти пустые файлы, а затем записать их, а также найти непустые файлы и их пустые:

find . -type f \( -empty -o -size +0b \) -exec bash -c "if [[ ! -s '{}' ]]; then echo 'hello' > '{}'; else cp /dev/null '{}'; fi" \;

Примечание:

Это выполняется из целевой папки, если нет, то просто добавьте путь к команде так:

find /path/to/folder ...
3
ответ дан 18 July 2018 в 09:04

Я не совсем понимаю вопрос, не могли бы вы быть более конкретными? Если вы хотите написать некоторый текст / код в файле, Vim работает очень хорошо.

vim [File Path]

, например

vim /etc/hosts
2
ответ дан 18 July 2018 в 09:04

Вы также можете использовать цикл оболочки ...

Сначала, чтобы заставить globbing рекурсивно отражать действие find, включите globstar

shopt -s globstar

Затем найдите файлы

for f in **; do [[ -f "$f" ]] && [[ ! -s "$f" ]] && echo "$f"; done

Вы увидите все пустые файлы. Условие -s в test означает, что файл длиннее 0 байтов. Используя ! -s вы можете найти файлы нулевой длины. -f проверяет, что файл является обычным файлом.

Теперь сделайте небольшую корректировку команды для записи в файлы:

for f in **; do [[ -f "$f" ]] && [[ ! -s "$f" ]] && echo "hello" > "$f"; done

Вы также сказали, что хотите знать, как чтобы очистить файлы, если они не пусты. Самый простой способ удалить файл - это усечь его с перенаправлением

> foo

пуст foo любого содержимого (или создает пустой файл foo, если он не существует). Таким образом, чтобы очистить файлы, содержащие текст (помните, что это уничтожит данные в файлах, убедитесь, что вы используете эту команду в правильном каталоге), вы можете использовать:

for f in **; do [[ -f "$f" ]] && if [[ -s "$f" ]] && > "$f"; done

Вы можете комбинировать две команды для записи в пустые файлы и пустые файлы, содержащие текст:

for f in **; do [[ -f "$f" ]] && if [[ ! -s "$f" ]]; then echo "hello" > "$f"; else > "$f"; fi; done

или более читабельно (помните, что это уничтожит данные в файлах, убедитесь, что вы запуск этой команды в правильном каталоге) :

for f in **; do [[ -f "$f" ]] && if [[ ! -s "$f" ]]; then echo "hello" > "$f" else > "$f" fi done

Это означает, что «для всех файлов в этом каталоге и его подкаталогах проверьте, является ли файл обычным файлом, и если он , тогда, если он пуст, напишите в нем «hello», и если он не пуст, то его пуст ».

Вы можете отключить globstar, когда это будет сделано, если хотите (но он все равно будет отменен когда вы запускаете новую оболочку, например, открывая новый терминал, набрав bash или переключая пользователя):

shopt -u globstar
2
ответ дан 18 July 2018 в 09:04

Я считаю, что это должно сработать:

find . -empty -type f -exec bash -c "echo 'hello' > {}" \;

Обновить, чтобы найти пустые файлы, а затем записать их, а также найти непустые файлы и их пустые:

find . -type f \( -empty -o -size +0b \) -exec bash -c "if [[ ! -s '{}' ]]; then echo 'hello' > '{}'; else cp /dev/null '{}'; fi" \;

Примечание:

Это выполняется из целевой папки, если нет, то просто добавьте путь к команде так:

find /path/to/folder ...
3
ответ дан 24 July 2018 в 19:14
  • 1
    зачем использовать bash -c там @George? – solfish 4 August 2017 в 17:02
  • 2
    могу ли я использовать xargs? как? – solfish 4 August 2017 в 17:03
  • 3
    См. [F1]: -c If the -c option is present, then commands are read from the first non-option argument command_string. If there are arguments after the command_string, they are assigned to the positional parameters, starting with $0. – George Udosen 4 August 2017 в 17:05

Я не совсем понимаю вопрос, не могли бы вы быть более конкретными? Если вы хотите написать некоторый текст / код в файле, Vim работает очень хорошо.

vim [File Path]

, например

vim /etc/hosts
2
ответ дан 24 July 2018 в 19:14
  • 1
    нет, я не имею в виду это, найдя все пустые файлы, я хотел бы написать все внутри того же скрипта / текста – solfish 4 August 2017 в 16:55

Вы также можете использовать цикл оболочки ...

Сначала, чтобы заставить globbing рекурсивно отражать действие find, включите globstar

shopt -s globstar

Затем найдите файлы

for f in **; do [[ -f "$f" ]] && [[ ! -s "$f" ]] && echo "$f"; done

Вы увидите все пустые файлы. Условие -s в test означает, что файл длиннее 0 байтов. Используя ! -s вы можете найти файлы нулевой длины. -f проверяет, что файл является обычным файлом.

Теперь сделайте небольшую корректировку команды для записи в файлы:

for f in **; do [[ -f "$f" ]] && [[ ! -s "$f" ]] && echo "hello" > "$f"; done

Вы также сказали, что хотите знать, как чтобы очистить файлы, если они не пусты. Самый простой способ удалить файл - это усечь его с перенаправлением

> foo

пуст foo любого содержимого (или создает пустой файл foo, если он не существует). Таким образом, чтобы очистить файлы, содержащие текст (помните, что это уничтожит данные в файлах, убедитесь, что вы используете эту команду в правильном каталоге), вы можете использовать:

for f in **; do [[ -f "$f" ]] && if [[ -s "$f" ]] && > "$f"; done

Вы можете комбинировать две команды для записи в пустые файлы и пустые файлы, содержащие текст:

for f in **; do [[ -f "$f" ]] && if [[ ! -s "$f" ]]; then echo "hello" > "$f"; else > "$f"; fi; done

или более читабельно (помните, что это уничтожит данные в файлах, убедитесь, что вы запуск этой команды в правильном каталоге) :

for f in **; do [[ -f "$f" ]] && if [[ ! -s "$f" ]]; then echo "hello" > "$f" else > "$f" fi done

Это означает, что «для всех файлов в этом каталоге и его подкаталогах проверьте, является ли файл обычным файлом, и если он , тогда, если он пуст, напишите в нем «hello», и если он не пуст, то его пуст ».

Вы можете отключить globstar, когда это будет сделано, если хотите (но он все равно будет отменен когда вы запускаете новую оболочку, например, открывая новый терминал, набрав bash или переключая пользователя):

shopt -u globstar
2
ответ дан 24 July 2018 в 19:14
  • 1
    Что такое shopt - u globstar ваше объяснение, какие изменения, если не использовать скрипт @Zanna? – solfish 5 August 2017 в 11:56
  • 2
    он отключает globstar, поэтому globbing с ** больше не распространяется на все файлы, включая подкаталоги & amp; их содержание @solfish – Zanna 5 August 2017 в 11:58
  • 3
    поэтому, если по статусу я могу достигнуть каждого файла, статус выключен, не так ли? – solfish 5 August 2017 в 12:00
  • 4
    это правильно @solfish - вот почему я поставил его в начале моего ответа, так что globbing будет вести себя как find и recurse в подкаталоги – Zanna 5 August 2017 в 12:01
  • 5
    hımm, и это просто полезно с '**', чтобы найти файлы и каталоги, я думаю @Zanna? – solfish 5 August 2017 в 12:03

Другие вопросы по тегам:

Похожие вопросы: