1

有很多方法可以做到这一点,我在这里介绍的就是其中一种,使用许多 Linux 发行版中默认安装的“mktemp”工具。

临时文件和目录

“mktemp”工具默认出现在“GNU coreutils”包中,它的目的仅仅是创建临时文件/目录。

创建临时文件和临时目录

它的基本使用非常简单。在不带任何参数的命令行中调用“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”是在子shell 中调用的(在“- crase”之间),其输出存储在变量“TEMP”中。

然后,为了可以读取或写入文件,只需使用变量,其中会有文件名,就像在ls, greprm命令中所做的那样。

如果您需要创建目录,如前所述,过程是相同的,只需-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但是,我想用而不是[bourn shell ..来做这个 sh。但我做了一些尝试,但没有任何效果。这是我尝试过的一个例子:

 # 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`"

这是行不通的!

谁能给我一个免费的样品?!

4

1 回答 1

3

创建临时文件可以使用file tempfile. 对于目录file tempdir将在 Tcl 8.7 中可用。

在 8.7 之前的 Tcl 版本中,您可以使用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 内部创建 shell 变量然后在下一个exec命令中使用这些变量的尝试总是会失败,因为当第一个子 shell 终止时这些变量就消失了。将结果保存在 Tcl 变量中,就像我在上面所做的那样。

当然,使用 可以更容易地找到目录glob -type d,但我保留了 shell 命令作为示例。


例如,临时目录的创建是这样的:

# 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] ; 
于 2019-12-29T09:03:49.937 回答