oma*_*mar 6 tar backup find filenames
主要问题:
我正在编写一个脚本来执行备份。我按以下方式制作文件列表:
LISTOFFILES=$(find ~ \( -name '*.[pP][dD][fF]' -o -name '*.[oO][dD][tT]' \))
Run Code Online (Sandbox Code Playgroud)
该变量LISTOFFILES
或多或少地存储如下内容:
/home/user/file1.pdf /home/user/file2.odt /home/user/Python Tutorial.pdf
Run Code Online (Sandbox Code Playgroud)
我的下一步是:
tar cvf backup.tar $LISTOFFILES
Run Code Online (Sandbox Code Playgroud)
Bash 响应是:
/home/user/file1.pdf
/home/user/file2.odt
/home/user/Python: Cannot stat: No such file or directory
tar: Tutorial.pdf
Run Code Online (Sandbox Code Playgroud)
据我所知,猛砸假设Python
和Tutorial.pdf
不同的文件。
有没有办法做一个包含反斜杠的文件列表,find
或者我应该更改为ls
与管道一起使用?
我想阅读您的提示和建议。
我的另一个问题:
这个问题的答案并不重要,但一个提示可能会有所帮助
如何仅列出文件名而没有文件路径的文件?
例如:file
代替/home/user/file
.
我已经尝试使用find
命令prune
和path
选项,但我没有成功。
至于你的主要问题,你需要采取不同的方法。您的方法是将所有文件放入 $LISTOFFILES 中的单个字符串中。然后当你去访问它时,你没有使用引号导致它在空格上分裂并给你你看到的结果。
获得所需结果的最简单方法如下:
find ~ \( -name '*.[pP][dD][fF]' -o -name '*.[oO][dD][tT]' \) -print0 | xargs -0 tar cvf backup.tar
Run Code Online (Sandbox Code Playgroud)
我们所做的是运行 find,并用 NULL 字符(-print0 部分)分隔每个结果。然后将 find 的输出传送到 xargs,它读取由 NULL 字符分隔的文件列表(-0 参数告诉 xargs 执行此操作),并将该文件列表作为参数传递给 'tar'。
对于您的第二个问题:如果您只想从find
命令中获取文件名,请使用 printf
find /path/to -printf '%f\n'
file.txt
Run Code Online (Sandbox Code Playgroud)
如果您的意思是一般而言,而不仅仅是使用 find,那么使用basename
.
# basename /path/to/file.txt
file.txt
Run Code Online (Sandbox Code Playgroud)
basename 就是为了做到这一点而设计的,仅此而已。
归档时间: |
|
查看次数: |
7547 次 |
最近记录: |