Скопируйте имена файлов и добавьте префикс пути в каталог рекурсивно

[115771]Псевдонимы специфичны для оболочки, так что когда вы запускаете ваш скрипт так:[12148]Он работает как дочерняя оболочка, которая обычно не будет иметь одинаковых псевдонимов. Сложность проблемы заключается в том, что вы также имеете дело с другой проблемой. Как только скрипт завершает работу дочернего shell'а, псевдонимы которого были удалены, он исчезает, возвращая вас в родительский shell, псевдонимы которого все еще остались нетронутыми.[12149]Я ни за что не узнаю, чтобы псевдонимы вашего shell'а были изменены таким образом.[12150]Так как же это сделать? [12151]Вы можете создать псевдоним или функцию в рамках текущей оболочки для выполнения этого действия.[12152]Пример[12153]решение псевдонима[12154]решение функции[12155]Проблемы с вышеупомянутым[12156]ОП предоставил эти решения для данного ответа, которые, по его словам, будут работать в его сценарии. Но в целом вы не можете изменить псевдонимы в цепочке команд, подобных этой, потому что каждая труба вызывает подоболочку, которая не сможет коснуться оболочки родителя. Итак, мы возвращаемся к той же проблеме, что и раньше со сценарием.[12157]Чтобы обойти это, вы можете вместо этого предоставить команде список псевдонимов в качестве аргументов. [12158]Пример[12159]Подтвердите псевдонимы в нашей оболочке:[12160]Содержимое [116277]local_alias[116278]:[12161]Эта команда разберет наши имена псевдонимов из файла [116279]local_alias[116280]:[12162]Мы можем использовать его для [116281]unalias[116282] этих псевдонимов как таковых:[12163] Теперь, когда мы подтверждаем, что они исчезли:[12164]
1
23.08.2015, 19:52
3 ответа

При использовании разделенных \ 0 строк, это может обрабатывать пробелов и \ n в именах файлов.

cd "${PROJECT_DIR%/*}"
outdir="output"; mkdir -p "$outdir"
find "$PROJECT_DIR" -type f -name '*.log' -printf "%p\0${outdir}/%P\0" |
  awk 'BEGIN{FS="/";RS=ORS="\0"} 
       NR%2||NF==2 {print; next}
       {gsub("/","#"); sub("#","/#"); print}' |
    xargs -0 -n2 cp -T
  • mkdir -p создает целевой каталог (без ошибок, если он уже существует).
  • find печатает \ 0 -удаленные пути к файлам (% P означает без find каталога $ 1 - дорожка).
  • awk создает 2 пути к файлам, требуемые для cp , как две записи с разделителями \ 0 .
  • xargs считывает \ 0 -ограниченных путей к файлам, по 2 за раз, и передает их в cp -T

Вот дерево из тестовый исходный каталог`

projectdir
├── file0.txt
├── file1.log
└── subdir
    ├── file2.log
    └── subsubdir
        └── file3.log

2 directories, 4 files

Вот дерево целевой каталог`

output
├── file1.log
├── #subdir#file2.log
└── #subdir#subsubdir#file3.log

0 directories, 3 files
1
27.01.2020, 23:27

(cd "$ PROJECT_DIR" && find. -Name "* .log") | tar -cf - -T - | (cd $ OUTPUT_DIR && tar -xf -)

  • cd в каталог проекта
  • найти все файлы журнала
  • список файлов журнала tar в stdout
  • cd в каталог вывода
  • untar stdin
1
27.01.2020, 23:27
#!/bin/bash

newdir=/absolute/path/output
olddir=/absolute/path/project

find $olddir -name '*log' | while read line ; do
  if [ "$olddir" == "$( basename "$line" )" ] ; then
    #just move the file if there are no subdirectories
    mv "$line" "$newdir"
  else
    #1) replace old project dir with nothing 
    #2) replace all slashes with hashes
    #3) set new outdir as prefix
    #4) hope that there are no colons in the filenames
    prefix="$( sed -e "s:$olddir::" -e 's:/:#:g'  -e "s:^:$newdir/:" <<<"$( dirname "$line")" )"
    mv "$line" "$prefix"#"$( basename "$line" )"
  fi
done 
1
27.01.2020, 23:27

Теги

Похожие вопросы