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

Для этого вы можете написать свой собственный небольшой сценарий оболочки. Например, создайте файл mytmuxгде-нибудь в своем PATHи сделайте его исполняемым chmod +x mytmuxс этим содержимым:

#!/bin/bash
rotate(){
        file=/tmp/mytmux.$session
        if [ -f "$file" ]
        then rm "$file"
        else touch "$file"
             while [ -f "$file" ] && tmux next-window -t "$session"
             do     sleep 3
             done
        fi
}
case $1 in
-rotate)shift
        session=${1?session name}
        rotate ;;
esac

Я сделал так, чтобы она принимала аргумент -rotateна случай, если позже вы добавите другие вспомогательные процедуры. К вашему ~/.tmux.confдобавьте подходящую привязку, например:

bind-key C run-shell -b 'mytmux -rotate #{session_name}'

-bдолжен работать в фоновом режиме. При первом вводе control -bC файл tmp не существует, поэтому цикл while запускается, выдавая команду next-windowкаждые 3 секунды. Второй раз файл tmp удаляется, и первый скрипт останавливается. Вы должны подождать 3 секунды, прежде чем начать снова, иначе вы можете запустить 2 скрипта!

0
03.01.2020, 01:04
2 ответа

Вам нужно перебрать файлы:

for file in Test_*.txt; do
    fileroot=${file%.txt}    # remove the extension
    cp -v "$file" "${fileroot}_Timestamp.txt"
done
1
28.01.2020, 02:38

Проблема -, как вы, возможно, выяснили -, заключается в том, что вы предполагали в своей первоначальной попытке, что фактическое значение подстановочного знака "передается" между различными аргументами вашей команды (, т.е. из вашего источника имя файла на предполагаемое целевое имя файла ).

Однако это не то, как расширение подстановочных знаков (или, скорее, "подстановочное расширение" )работает в оболочке. Скорее, везде, где появляется подстановочный знак, оболочка расширяет его внутри до списка совпадающих файлов и выполняет вашу команду, как если бы вы указали весь список (, см., например. это руководство по подстановке оболочки ). Итак, если у вас есть файлы

Test_a.txt
Test_b.txt
Test_c.txt

в вашем каталоге, ваша команда cpфактически будет вести себя так, как если бы вы набрали

cp Test_a.txt Test_b.txt Test_c.txt Test_*_20200102-160523.txt

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

Почему теперь он жалуется на отсутствие каталога Test_*_20200102-160523.txtс литералом*в нем? Стандартное поведение (по крайней мере дляbash)заключается в том, что если вы укажете подстановочный знак, а соответствующий файл отсутствует, подстановочный знак будет интерпретироваться буквально как сам -, и поскольку ваше выражение Test_*_20200102-160523.txtпредназначалось как имя целевого файла, он еще не существует в текущем каталоге.

Это причина ответа @glennjackman о том, что вам нужно перебрать входные файлы для достижения желаемого результата.

0
28.01.2020, 02:38

Теги

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