Как сделать скопировать и переименовать файл, указанный в файле TXT?

Вы не можете. Выбор используется оператором case, чтобы решить, что делать. Это не устанавливается оператором case.

Вместо этого вы можете попробовать что-то вроде этого:

selection=

until [ "$selection" = "0" ]; do

  cmd=''

  echo ""
  echo "PROGRAM MENU"
  echo "1 - display free disk space"
  echo "2 - display free memory"
  echo ""
  echo "0 - exit program"
  echo ""
  echo -n "Enter selection: "
  read selection
  echo ""

  case "$selection" in
      1) cmd='df' ;;
      2) cmd='free' ;;
      0) cmd='exit' ;;
      *) echo "Please enter 1, 2, or 0"
  esac

  if [ -n "$cmd" ] ; then 
    echo "selection $selection is '$cmd'"
    $cmd
  fi

done

Обратите внимание, что он запускает echo "selection $ selection is '$ cmd' перед выполнением $ cmd , в противном случае он завершится до echo , когда $ selection = 0.

1
14.04.2018, 15:28
2 ответа

Из примера OP переименование и изменение кажутся довольно последовательными, например, filename.jpg кажется всегда с префиксом того же пути плюс буква «t», превращающаяся в thumb / tfilename.jpg . В таком случае можно сделать что-нибудь попроще.

Если все предназначены для каталога "thumb /".

Иметь тестовые файлы abc.jpg, xyz.jpg в текущем каталоге.

Вот пример списка файлов

$ cat testfile
abc.jpg
xyz.jpg

Тест

Полезно выполнить тестовую версию команды с эхом, чтобы увидеть, что будет делать код:

$ while read my_file; do
   echo cp -a "$my_file" "thumb/t$my_file"
done < testfile

Результат теста:

cp -a abc.jpg thumb/tabc.jpg
cp -a xyz.jpg thumb/txyz.jpg
  • при чтении my_file; делать ...Синтаксис done будет обрабатывать stdin построчно
  • использует < для перенаправления testfile на stdin, поэтому оператор while читает его
  • my_file - это переменная, которую мы создали для хранения ввода, на которую, как мы видим в теле кода, можно ссылаться с помощью $ my_file
  • используйте кавычки, чтобы избежать потенциальных проблем, если в именах файлов есть пробелы или другие странные слова. символы, которые могут разбивать пробелы, которые команда cp использует для распознавания аргументов

Final

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

$ while read my_file; do
  cp -a "$my_file" "thumb/t$my_file"
done < testfile

Когда вы проверьте каталог thumb / , вы увидите скопированные туда два тестовых файла.

Окончательный, с обратной связью

По умолчанию cp не дает обратной связи, если нет ошибок. Поэтому, если вы копируете сотни или тысячи файлов, может показаться, что вообще ничего не происходит. Чтобы увидеть обратную связь, используйте подробный параметр -v :

$ while read my_file; do
  cp -av "$my_file" "thumb/t$my_file"
done < testfile

Результат:

`abc.jpg' -> `thumb/tabc.jpg'
`xyz.jpg' -> `thumb/txyz.jpg'
0
29.04.2021, 00:23

Проще всего сxargs:

< file-list.txt  xargs -n2 cp -v
0
29.04.2021, 00:23

Теги

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