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

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

find . -empty -type f 

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

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

4 ответа

Поскольку Вы попросили решение сделать это с помощью 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
ответ дан 5 August 2017 в 21:20

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

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
ответ дан 5 August 2017 в 21:20

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

vim [File Path]

, например,

vim /etc/hosts
1
ответ дан 5 August 2017 в 21:20

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

Во-первых, для создания 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

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

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

shopt -u globstar
2
ответ дан 5 August 2017 в 21:20

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

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