我的目录中有一堆在不同月份创建的文件。我想过滤掉在特定月份创建的文件并使用 tar 功能存档这些文件。到目前为止我尝试过的代码是
months="Dec-2021"
decfiles=find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec | tar cz decemberfiles.tar.gz"
echo $decfiles
上面的代码引发了我这样的错误
files.sh: 3: .: Illegal option -n
tar: Refusing to write archive contents to terminal (missing -f option?)
tar: Error is not recoverable: exiting now
我似乎无法弄清楚这一点,而且我也是 bash 的新手。任何帮助解决这个问题的帮助将不胜感激。
答案1
由于您是新手,我不会只是给您答案,我还会尝试解释如何开始解决此类问题。
首先,当您看到此类问题时,请尝试将它们分离并隔离为较小的命令。
例如,不要像您那样直接尝试将结果保存在文件中:
decfiles=find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec | tar cz decemberfiles.tar.gz"
只需尝试单独运行该find
命令即可。
find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec | tar cz decemberfiles.tar.gz"
您很快就会看到:
错误#1
find: I cannot figure out how to interpret ‘01-Dec-2021 +1 month-1 sec | tar cz decemberfiles.tar.gz’ as a date or time
如果您真正阅读它,您会注意到您正在引号内运行管道:
"01-$months +1 month-1 sec | tar cz decemberfiles.tar.gz"
尝试#2
所以现在你应该希望找出 find 命令应该是:
find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec"
现在您将获得文件和目录的列表,这是一个开始。我建议你只打印文件,而不是目录,通过添加-type f
.
find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f
所以现在我们要去某个地方。
接下来,我假设您想尝试类似的事情:
find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f |tar cz decemberfiles.tar.gz
这会抛出:
错误#2
tar: Refusing to write archive contents to terminal (missing -f option?)
tar: Error is not recoverable: exiting now
它表明您缺少-f
选项,因此您查看 的手册页tar
并看到您用来-f ARCHIVE
提供存档的名称。您提供了文件名,但没有说这是存档。所以现在你尝试:
尝试#3
find . -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f |tar czf decemberfiles.tar.gz
错误#3
现在它会抛出新的错误:
tar: Cowardly refusing to create an empty archive
Try 'tar --help' or 'tar --usage' for more information.
为什么它说您正在尝试创建一个空存档?再次查看 的手册tar
,您会发现您需要提供文件列表,如下所示论点:
tar -c [-f ARCHIVE] [OPTIONS] [FILE...]
您尝试通过管道将文件提供给 tar 命令的 STDIN。所以它需要类似于:
tar czf decemberfiles.tar.gz <file1> <file2> <file3> ...
该命令正在生成您的文件列表find
。如何向tar
命令提供这些文件?有几个选项我不会解释,让你自己阅读。
选项1
tar czf decemberfiles.tar.gz $(find ./ -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f)
选项#2
tar czf decemberfiles.tar.gz `find ./ -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f`
提示:如果你想更好地理解它在做什么,可以尝试在命令前添加 echo 来看看它会是什么样子(我不会在这里写输出,让你自己找到它):
echo tar czf decemberfiles.tar.gz `find ./ -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f`
选项#3
最后一个选项,让您熟悉该xargs
命令:
find ./ -newermt "01-$months -1 sec" -and -not -newermt "01-$months +1 month-1 sec" -type f |xargs tar czf decemberfiles.tar.gz
所以现在您至少应该拥有存档,所以这是一个开始。现在你应该发现你还有很多东西要学。
您仍然有一些问题需要克服,例如零件decfiles=...
。再次尝试运行一个较小的命令并查看它的内容,并搜索如何将命令的输出分配给 bash 中的变量。我不会在这里解释它,因为你可以用谷歌搜索它,但希望现在你对如何开始学习 bash 并逐步克服障碍有一些更好的想法。