Я могу найти пустые файлы в текущем каталоге с помощью;
find . -empty -type f
Я хотел бы знать
Поскольку Вы попросили решение сделать это с помощью 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
Я полагаю, что это должно работать:
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 ...
Я не вполне понимаю вопроса, Вы могли быть более конкретными? Если Вы хотите записать некоторый текст/код в файле, Vim работает действительно хорошо.
vim [File Path]
, например,
vim /etc/hosts
Вы могли также использовать цикл оболочки...
Во-первых, для создания 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