Как я могу заменить содержимое всех файлов в каталоге другим файлом? - PullRequest
3 голосов
/ 06 февраля 2012

Я пытаюсь написать простой скрипт bash, который заменяет все файлы в каталоге новым файлом, но сохраняет имя каждого заменяемого файла.

Кажется, это должно быть легко, поэтому заранее извиняюсь, если это очевидно.

Ответы [ 5 ]

3 голосов
/ 06 февраля 2012

Поскольку вам нужно только содержимое нового файла, но имена файлов должны быть одинаковыми, вы можете сделать это за один шаг с помощью cat.

Следующие два сценария работают рекурсивно и с любым именем файла, даже с теми, которые содержат пробелы или символы новой строки или что-то еще, что может прерваться, если вы попытаетесь проанализировать ls вывод.

Bash> 2.x

#!/bin/bash
newFile="/path/to/newFile"
while IFS= read -r -d '' file; do
  cat "$newFile" > "$file"
done < <(find . -type f -print0)

Bash 4.x

#!/bin/bash
newFile="/path/to/newFile"
shopt -s globstar
for file in **; do
  [[ -f "$file" ]] || continue
  cat "$newFile" > "$file"
done
2 голосов
/ 06 февраля 2012
#!/bin/sh
for i in *; do
  if [ -f "${i}" ] ; then 
    cat /dev/null > "${i}";
  fi;
done
0 голосов
/ 07 февраля 2012

Если у вас установлен GNU Parallel:

find . -type f -print0 | parallel -0 cat /path/to/foo \> {}

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

parallel cat /path/to/foo \> {} ::: *

Он правильно работает с файлами, содержащими пробел, 'и "(для имен файлов, содержащих символ новой строки, вам нужно выше).

Вы можете установить GNU Parallel просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel

Посмотрите вступительные видео, чтобы узнать больше: http://pi.dk/1

0 голосов
/ 06 февраля 2012

Попробуйте это:

for file in *; do
  if [ -f "$file" ] ; then
    > "$file"
  fi
done
0 голосов
/ 06 февраля 2012
#!/bin/bash
while read name; do
 cp "/directory/$name" /backup/
 mv /new/replacement "/directory/$name"
 echo "replaced /directory/$name with /new/replacement and stored backup in /backup"
done <<< "$(ls -1 /directory/)"

вы, вероятно, планируете изменить / directory / backup и / new / replace в примере кода.Вы можете использовать "find" вместо "ls", чтобы сделать это рекурсивным.Теперь с пробелами проблем не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...