2017-01-05 3 views
0

У меня есть как минимум 40 файлов (20 в xml. формате и 20 в формате safe.). В качестве примера некоторые из этого:Поместите имена файлов в текст

iw1-20150612.SAFE.safe 
iw2-20150714.SAFE.safe 
iw1-20150612.xml 
iw2-20150714.xml 

Я хочу поставить это имен файлов в текстовом файле в определенном месте текста с помощью терминала в Linux (или текст добавляется в ходе этого процесса)

текст может быть любым, как, например:

anytext iw1-20150612.SAFE.safe 
anytext2 iw1-20150612.xml anytext2 iw1-20150612.xml 
anytext Iw2-20150714.SAFE.safe 
anytext2 iw2-20150714.xml anytext2 iw2-20150714.xml 

примера, что мне нужно здесь:

awk 'NR>1 {print $0}' < ../og/iw1-20150612.SAFE.safe > tmp_file 
cat ../og/iw1-20150612.xml tmp_file ../og/m.xml > ./iw1-20150612.xml 
awk 'NR>1 {print $0}' < ../og/iw2-20150714.SAFE.safe > tmp_file 
cat ../og/iw2-20150714.xml tmp_file ../og/m.xml > ./iw2-20150714.xml 
#and etc 

Также важно сохранить сортировку по имени файла, как в папке. Моя попытка:

find /any/directory/ -type f -printf "%f\n" >> data.txt 

Но я не знаю, как «выбрать место» для вставки текста.

+1

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

+0

Это лучше? Надеюсь, теперь станет ясно. – user2899758

+0

@ user2899758: Нет, где ясно, что вы пытаетесь сделать? Кстати, что случилось с вашими попытками? – Inian

ответ

1

Вы можете использовать простой цикл bash for loop для перебора по именам файлов. Пока каждый safe файл имеет соответствующий xml файл, вы можете

  • цикла по safe файлам,
  • получить базовое имя файла без расширения
  • и создать xml имя файла и тексты оттуда

script.sh

#!/bin/bash 

OUTFILE=textfile 
EXTENSION=.SAFE.safe 

# rm -rf "$OUTFILE" # uncomment if required 
for f in *${EXTENSION} 
do 
    # f i a .. safe file we remove the extension 
    base=${f%%$EXTENSION} 
    echo -e "anytext $f\nanytext2 ${base}.xml anytext2 ${base}.xml" >> "$OUTFILE" 
done 

Установите OUTFILE при необходимости, раскомментируйте rm, если требуется.

Обновление с помощью AWK

Если у вас есть много файлов и Баш для цикла, чтобы замедлить из-за частую операции записи в $OUTFILE, вот еще версия оболочки стиля тех же идеи:

  • мы конвейеру SAVE.safe имена файлов в AWK,
  • использовать точку в качестве разделителя полей (таким образом $1 это базовое имя, $0 исходное имя файла)
  • и создать нужный текст с printf:

    ls -1 *.SAFE.safe | awk -F. '{printf("anytext %s\nanytext2 %s.xml anytext2\n",$0,$1)}' 
    
+0

Очень круто спасибо, работал! Однако, для интереса, и если имена различны для разных форматов файлов? Я смог сделать это только для одного формата. 'для a в $ (cd any/directory; ls * xml) do echo" anytext $ a anytext $ a ">> data.txt done' – user2899758

+1

Если разные расширения требуют другого вывода, и вы хотите сохранить последовательность, вам нужно 'if statements' на расширении. В документации по bash или awk есть все подробности. –