Как создать временные файлы и каталоги shellscript через язык Tcl?

Есть множество способов сделать это, и тот, который я представляю здесь, является одним из них, используя инструмент "mktemp", который уже установлен по умолчанию во многих дистрибутивах Linux.

Временные файлы и каталоги

Инструмент "mktemp" по умолчанию входит в пакет "GNU coreutils" и предназначен исключительно для создания временных файлов / каталогов.

Создание временных файлов и tempdir

Его базовое использование довольно просто. Вызов mktemp из командной строки без каких-либо параметров приведет к созданию файла на вашем диске внутри / tmp, имя которого будет отображаться на экране. Посмотрите:

$ mktemp
/tmp/tmp.JVeOizVlqk

Создать каталоги так же просто, как добавить параметр "-d" в командную строку.

$ mktemp -d
/tmp/tmp.sBihXbcmKa

Использование на практике

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

В приведенном ниже примере есть небольшой скрипт, кстати, бесполезный, но который показывает нам подходящий шаг за шагом. Посмотрите:

#!/bin/sh
#
#Create a temporary file
TEMP = `mktemp`
#Save all the content of the entered path
ls -l "$1"> $TEMP
#Read temporary file and list only directories
grep ^d $TEMP
sudo rm -f $TEMP

Обратите внимание, что команда "mktemp" была вызвана в подоболочке (между "- crase"), а ее выходные данные сохранены в переменной "TEMP".

Затем, чтобы файл можно было читать или записывать, просто используйте переменную, где будет имя файла, как это сделано в ls, grep а также rm команды.

Если вам нужно было создать каталоги, как уже было сказано, процесс будет таким же, просто добавим -d в командную строку mktemp.

#!/bin/sh
#
TEMP = `mktemp -d`
cd $TEMP
.
.
.
sudo rm -rf $TEMP

Если вы хотите создать много временных файлов, мы используем параметр "-p", который указывает путь, по которому файл должен быть создан.

#!/bin/sh
#
TEMP = `mktemp -d`
cd $TEMP
FILE1 = `mktemp -p $TEMP`
.
.
.
sudo rm -f $FILE1
sudo rm -rf $TEMP

Только это. Теперь ваши скрипты смогут более профессионально использовать временные файлы.

Однако я хочу сделать это с помощью tclsh вместо того sh[bourn shell.. но я сделал несколько попыток, но ничего не помогло. Вот пример того, что я пробовал:

 # Create a temporary file
 exec sh -c "TEMP =`mktemp -d`"

 set dir [cd $TEMP]

 # Save all content from the entered path
 exec ls -l "$1"> $TEMP

 set entry [glob -type f $env(dir) *.jpg]

 # Read temporary file and list only directories
 puts $entry

Моя самая большая проблема заключалась и остается в создании переменной

# Create a temporary file
 exec sh -c "TEMP =`mktemp -d`"

Это не работает!

Может кто-нибудь дать мне бесплатный образец?!

1 ответ

Решение

Создание временных файлов можно выполнить с помощью file tempfile. Для справочниковfile tempdir будет доступен в Tcl 8.7.

В версиях Tcl до 8.7 вы можете использовать file tempfile чтобы получить путь к временному расположению и затем создать каталог с этим именем:

set fd [file tempfile temp]
close $fd
file delete $temp
file mkdir $temp

В file tempfile команда также позволяет указать шаблон, аналогично параметру -p команды mktemp


Чтобы ответить на обновленный вопрос, вы можете сделать что-то вроде:

# Create a temporary file
set temp [exec mktemp]
# Save all content from the entered path
exec ls -l [lindex $argv 0] > $temp
# Read temporary file
set f [open $temp]
set lines [split [read $f] \n]
close $f
# List only directories
puts [join [lsearch -all -inline $lines {d*}] \n]

Я проигнорировал ваше смешение каталогов и обычных файлов и того, что должен быть *.jpg.

Ваши попытки создать переменные оболочки внутри Tcl, а затем использовать их в следующем execкоманда всегда будет терпеть неудачу, потому что эти переменные исчезнут, когда завершится первая подоболочка. Вместо этого сохраните результаты в переменных Tcl, как я сделал выше.

Конечно, вам было бы легче найти каталоги, используя glob -type d, но я оставил команду оболочки в качестве примера.


Например, создание временного каталога будет таким:

# Create a temporary directory
set dir [exec mktemp -d] ; 

# Now, files insert in directory 
# (In this example I am decompressing a ZIP file and only JPEG format images)
exec unzip -x $env(HOME)/file.zip *.jpg -d $dir ; 

# Look the directory now with this command:
puts [glob -nocomplain -type f -directory $dir -tails *.jpg] ; 
Другие вопросы по тегам