Я могу найти пустые файлы в текущем каталоге с:
find . -empty -type f
Я хотел бы знать
Как написать текст в пустые файлы, которые я нашел. Как очистить файлы, если они уже содержат текст.Как вы попросили решение сделать это, используя xargs:
find -empty | xargs -I files sh -c 'echo hello > $1' -- files
Тест:
$ 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
Как вы попросили решение сделать это, используя xargs:
find -empty | xargs -I files sh -c 'echo hello > $1' -- files
Тест:
$ 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
Как вы попросили решение сделать это, используя xargs:
find -empty | xargs -I files sh -c 'echo hello > $1' -- files
Тест:
$ 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
Это означает, что «для всех файлов в этом каталоге и его подкаталогах проверьте, является ли файл обычным файлом, и если он , тогда, если он пуст, напишите в нем «hello», и если он не пуст, то его пуст ».
Вы можете отключить globstar, когда это будет сделано, если хотите (но он все равно будет отменен когда вы запускаете новую оболочку, например, открывая новый терминал, набрав bash или переключая пользователя):
shopt -u globstar
Я считаю, что это должно сработать:
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
Это означает, что «для всех файлов в этом каталоге и его подкаталогах проверьте, является ли файл обычным файлом, и если он , тогда, если он пуст, напишите в нем «hello», и если он не пуст, то его пуст ».
Вы можете отключить globstar, когда это будет сделано, если хотите (но он все равно будет отменен когда вы запускаете новую оболочку, например, открывая новый терминал, набрав bash или переключая пользователя):
shopt -u globstar
Я считаю, что это должно сработать:
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
Это означает, что «для всех файлов в этом каталоге и его подкаталогах проверьте, является ли файл обычным файлом, и если он , тогда, если он пуст, напишите в нем «hello», и если он не пуст, то его пуст ».
Вы можете отключить globstar, когда это будет сделано, если хотите (но он все равно будет отменен когда вы запускаете новую оболочку, например, открывая новый терминал, набрав bash или переключая пользователя):
shopt -u globstar