在Solaris上查找和tar文件

时间:2014-10-12 10:39:21

标签: unix find solaris tar

我的bash脚本有点问题。我是unix世界的新手,所以我觉得很难处理一个练习。我要做的是在Solaris服务器上查找具有特定名称的文件,在特定时间进行修改并将它们存档在一个.tar文件中。前两点很简单,但我试图将其归档是一场噩梦。问题是,我不断将整个文件树(最后的文件)归档到.tar文件,但我只需要一个文件。我的代码如下所示:

find ~ -name "$maska" -mtime -$dni | xargs -t -L 1 tar -cvf $3 -C

其中$ maska是文件的名称,$ dni表示修改时间,$ 3只是存档名称。我发现了关于-C开关的问题,让我跳转到所需文件所在的文件夹,但是当我将它与xargs一起使用时,似乎只是跳到那里而不做任何其他事情。

所以我的问题是:

1)有没有可能以这种方式实现我的目标?

请记住,我不会在gnu tar上工作。我必须使用命令:tar,find。

编辑:我想更多地指出我的问题。当我使用脚本时,例如,文件a,它应该查找它,因为脚本中显示的点(它' s~),它将找到的所有内容应该在一个tar文件中。

我现在得到的是(我在/ home / me / Scripts中):

-bash-3.2$ ./Script.sh a 1000 backup
 a /home/me/Program/Test/a/ 0K
 a /home/me/Program/Test/a/a.c 1K
 a /home/me/Program/Test/a/a.out 8K

所以脚本做了一些打包。接下来我想查看我的打包文件,所以:

 -bash-3.2$ tar -tf backup 
 /home/me/Program/Test/a/
 /home/me/Program/Test/a/a.c
 /home/me/Program/Test/a/a.out

这就是问题所在。 Tar文件中包含所有路径,所以如果我要解压缩它,而不是只获取我想要存档的文件,我将在旧的地方替换它们。对于可视化:

-bash-3.2$ ls
Script.sh*   Script.sh~*  backup
-bash-3.2$ tar -xvf backup 
x /home/me/Program/Test/a, 0 bytes, 0 tape blocks
x /home/me/Program/Test/a/a.c, 39 bytes, 1 tape blocks
x /home/me/Program/Test/a/a.out, 7928 bytes, 16 tape blocks
-bash-3.2$ ls
Script.sh*   Script.sh~*  backup

这就是问题所在。

所以我想要的是将所有那些所需的文件(例如上面的例子)打包在一个没有这些路径的tar文件中,所以它只是在我运行Script.sh的目录中解压缩。

4 个答案:

答案 0 :(得分:0)

我不确定你想要什么,但可能就是这样:

find ~ -name "$maska" -mtime -$dni -exec tar cvf $3 {} +

编辑:写完主要问题后的第二次尝试是绝对路径:

( cd ~; find . -name "$maska" -type f -mtime -$dni -exec tar cvf $3 {} + )

编辑:第三次尝试,在您编写完成后,您希望存档中没有路径,maska是目录名称,$3需要位于当前目录中:

mkdir ~/foo && \
  find ~ -name "$maska" -type d -mtime -$dni -exec sh -c 'ln -s $1/* ~/foo/' sh {} \; && \
  ( cd ~/foo ; tar chf - * ) > $3 && \
  rm -rf ~/foo

如果~/foo由于某种原因已经存在,请将~/somethingElse替换为~/foo

答案 1 :(得分:0)

也许你可以这样做:

#!/bin/bash
find ~ -name "$maska" -mtime -$dni -print0 | while read -d $'\0' file; do
   d=$(dirname "$file")
   f=$(basename "$file")
   echo $d: $f      # Show directory and file for debug purposes
   tar -rvf tarball.tar -C"$d" "$f"
done

我手边没有Solaris盒子进行测试: - )

答案 2 :(得分:0)

首先,我的假设: 1.“一个tar文件”,就像你说的那样 2.没有绝对路径,即如果你备份〜/ dir / file,你应该能够在/ tmp获取/ tmp / dir / file中测试它。

如果问题是完整路径,则应替换

find ~ # etc

cd ~ || exit
find . # etc

如果tar存档不是绝对名称,则应该类似于

(
cd ~ || exit
find . etc etc | xargs tar cf - etc etc
) > $3

解释 “(...)”运行一个子壳,这意味着你改变的一些tings在parens之外没有任何影响;当前目录就是其中之一,所以“(cd whatever; foo)”意味着你运行另一个shell,更改它的当前目录,从那里运行foo,然后你回到你的脚本中从未改变目录。

“cd~ || exit”是偏执狂,意思是“cd~;如果失败,退出”。

“”。是一个别名,意思是“当前目录,无论是什么”;玩“发现”。 vs“find~”如果你不知道它意味着什么,你会比我在这里解释的更好理解它。

“tar cf - ”表示您在标准输出上创建tar存档;我认为语法足够便携,你可能不得不用“/ dev / stdout”替换“ - ”或者在solaris上使用的任何东西(最简单的解决方案就是“tar”,没有“c”)命令,但读起来很难看。

在parens之外的最后一个“> $ 3”是输出重定向:不是将输出写入终端,而是将其保存到文件中。

所以整个脚本如下所示: - 打开子壳 - 将subshel​​l的当前目录更改为〜 - 在子shell中,找到比请求更新的文件,将它们存档,并将生成的tar存档的内容写入标准输出 - 子shell的标准输出保存到3美元;因为重定向在parens之外,相对路径相对于脚本的$ PWD被解析,这意味着,例如,如果从/ tmp目录运行脚本,您将在/ tmp目录中获得tar存档(它将在〜如果重定向发生在子shell中。)

如果我误解了你的问题,解决方案不起作用或解释不明确让我知道(答案太长了,但我已经知道了:)。

答案 3 :(得分:0)

pax command将输出与tar兼容的档案,并具有重写路径名所需的灵活性。

find ~ -name "$maska" -mtime -$dni | pax -w -x ustar -f "$3" -s '!.*/!!'

以下是选项的含义,从手册页中解释:

  • - w以归档格式将文件操作数的内容写入标准输出(或-f选项指定的路径名​​)。
  • -x ustar输出存档格式是IEEE POSIX标准中指定的扩展tar交换格式。
  • -s '!.*/!!'使用正则表达式语法根据替换表达式修改文件操作数。在这里,它会删除每个文件名中从开头到最后/的所有字符。