2015-07-20 11 views
-1

У меня есть куча файлов в каталоге, old_dir. Я хочу:Bash: удалить первую строку файла, создать новый файл с префиксом в новом каталоге

  1. удалить первую строку каждого файла (например, с помощью «SED„1d“»)
  2. сохранить результат как новый файл с префиксом, new_, добавляется в исходное имя файла (например, с помощью «{,} new_ старого имени»)
  3. добавить эти файлы в другой каталог, new_dir, перезапись конфликтующих имен файлов

Как это сделать с Баш скрипт? Не имея проблем с нанесением частей.

+2

Что вы пробовали? Очень сложно отлаживать ваш код, когда вы не включаете его в свой вопрос! – ghoti

+0

Скорее всего, это однострочный скрипт, предполагающий, что ваши требования действительно настолько просты. Вы пробовали что-нибудь для этого? –

ответ

0
#!/usr/bin/env bash 

old_dir="/path/to/somewhere" 
new_dir="/path/to/somewhere_else" 
prefix="new_" 

if [ ! -d "$old_dir" -o ! -d "$new_dir" ]; then 
    echo "ERROR: We're missing a directory. Aborting." >&2 
    exit 1 
fi 

for file in "$old_dir"/*; do 
    tail +2 "$file" > "$new_dir"/"${prefix}${file##*/}" 
done 

Важной частью этого являются:

  • for петля, которая позволяет сделать работу на каждом $file.
  • tail +2 который является обозначением, которое должно удалить первую строку файла. Если ваш tail не поддерживает это, вы можете получить тот же результат с sed -e 1d.
  • ${file##*/} который функционально эквивалентен basename "$file", но без нереста ребенка.

Действительно, ничто из этого не является специфичным для bash. Вы можете запустить это в /bin/sh в большинстве операционных систем.

Обратите внимание, что приведенный выше код предназначен для объяснения процесса . Как только вы поймете этот процесс, вы сможете разработать более быстрые и короткие стратегии для достижения того же. Например:

find "$old_dir" -depth 1 -type f -exec sh -c "tail +2 \"{}\" > \"$new_dir/$prefix\$(basename {})\"" \; 

Примечание: Я не проверял это. Если вы планируете использовать любое из этих решений, убедитесь, что вы их понимаете, прежде чем пытаться, чтобы вы случайно не сбивали ваши данные.

+0

Первое решение выше работает! Огромное спасибо. – Nemophilia

Смежные вопросы