如何在需要时将包含反斜杠的文件列表存储在变量中?

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)

据我所知,猛砸假设PythonTutorial.pdf不同的文件。

有没有办法做一个包含反斜杠的文件列表,find或者我应该更改为ls与管道一起使用?

我想阅读您的提示和建议。

我的另一个问题:

这个问题的答案并不重要,但一个提示可能会有所帮助

如何仅列出文件名而没有文件路径的文件?

例如:file代替/home/user/file.

我已经尝试使用find命令prunepath选项,但我没有成功。

phe*_*mer 7

至于你的主要问题,你需要采取不同的方法。您的方法是将所有文件放入 $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 就是为了做到这一点而设计的,仅此而已。