Переименовать файлы на одно и то же имя файла без расширения с помощью команды find Command

Проблема с примером кода в вопросе очень тонкая; для записи в именованную трубу вам нужно & фонировать команду, иначе она будет блокироваться в ожидании чтения. Однако когда вы это сделаете, "команды, запущенные в фоне с &, перенаправят свой стандартный ввод [на] /dev/null. ", то есть /dev/null - это то, что передается в p, а не в stdin.

В Bash обходной путь прост: перенаправьте stdin в фоновый процесс с помощью 0. Тогда пример будет работать правильно:

$ echo foo | { mkfifo p; cat 0<&0 > p & cat < p; rm p; }
foo

Полная функция compose в итоге выглядит так:

compose() {
  dir=$(mktemp -d)                 # Create a temp dir to hold the pipes
  cd $dir                          #   to avoid filename conflicts
  i=0                              #
  mkfifo "pipe$i"                  # Create pipe0, the output for command $1
  ($1 0<&0 > "pipe$i" &)           # Start $1, reading stdin and writing to pipe0
  shift                            # Shift off $1 since it's running
    for c in "$@"; do              # Loop over the remaining commands
    ii=$((i+1))                    # 
    mkfifo "pipe$ii"               # Create a pipe i+1, the next command's output
    ($c < "pipe$i" > "pipe$ii" &)  # Start the next command, reading from the
    i=$ii                          #   i'th pipe and writing to the i+1'th
  done                             #
  cat "pipe$i"                     # Output the last pipe, executing the commands
  cd - > /dev/null                 # Change back to the old directory
  rm -rf $dir                      # Remove all the pipes
}

0
28.11.2018, 16:49
2 ответа

Если у вас есть или вы можете установить расширение PERL,rename(apt-get install renameв дистрибутиве на основе Debian -)...

find ~ -type f -name "*.hhs" -exec rename -d ".hhs" {} +

Опция -dили --deleteудаляет указанную строку.

3
28.01.2020, 02:18

Требуется инструмент, который может удалить суффикс имени файла .hhsиз имени файла. findне может сделать это за вас, поэтому вам придется вызывать другую утилиту через-exec:

find "$HOME" -type f -name '*.hhs' -exec sh -c '
    for pathname do
        cp -i "$pathname" "${pathname%.hhs}"
    done' sh {} +

Я не использую здесь basename, так как это также удалит путь к каталогу из найденных путей (, которые можно снова вставить с помощью dirname, но это приведет к беспорядку в коде ).

Вместо этого я вызываю внутристрочный -сценарий оболочки с максимально возможным количеством найденных путей и позволяю сценарию перебирать их, копируя отдельные файлы. Новое имя создается с использованием стандартной подстановки параметров, которая удаляет строку .hhsиз конца значения $pathname.

Связанные:

1
28.01.2020, 02:18

Теги

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