0

I'm trying to use tar(1) to create an archive of files newer than a specific file (fileA). However, when I use find(1) to obtain the list of files to pass to tar, some files are listed multiple times:

$ touch fileA
$ mkdir test
$ touch test/{fileB,fileC}
$ tar -c -v $(find test -newer fileA) > test.tar
test/
test/fileC
test/fileB
test/fileC
test/fileB

Using xargs(1) to pass the list of files to tar results in similar behavior:

$ find test -newer fileA | xargs tar -c -v > test.tar
test/
test/fileC
test/fileB
test/fileC
test/fileB

Using sort(1) and uniq(1) to remove duplicates doesn't work either:

$ find test -newer fileA | sort | uniq | xargs tar -c -v > test.tar
test/
test/fileC
test/fileB
test/fileB
test/fileC

Is there a way for tar to only include each file newer than fileA once?

Edit: I'm specifically looking for a solution that doesn't involve GNU extensions to tar (for example, which would work with suckless tar).

2 Answers 2

1
find test -newer fileA

finds the test directory as well as the individual files therein, so tar adds test (and all its contents), then test/fileB and test/fileC.

Tighten your find to avoid this:

tar -c -v $(find test -type f -newer fileA) > test.tar

Note that using command substitution in this way can cause issues e.g. with filenames containing spaces or wildcards; to avoid that, use

find test -type f -newer fileA -print0 | tar -c -v --null -T- -f - > test.tar

(with GNU find and tar), or

find test -type f -newer fileA -exec tar cvf - {} + > test.tar

(assuming you don’t have too many files to archive).

0
0

You can try something like:

tar --newer=fileA cvf test.tar test
3
  • That command gives tar: Substituting -9223372036854775807 for unknown date format 'fileA'. I guess that fileA modification time could be extracted and passed to --newer option to GNU tar, but I'm looking for a solution that doesn't involve GNU extensions to tar. I'll update the question to reflect that. Commented Jul 6, 2022 at 14:35
  • 1
    @Vilinkameni, tar is not a standard command, all implementations are different and mostly incompatible between each other. Commented Jul 6, 2022 at 15:01
  • I never said it is, just that I want to avoid options specific to GNU tar. I updated my question to reflect that. The options supported by suckless tar are a subset of the options of GNU tar, however, and I suspect also a subset of some other variants of tar. Commented Jul 6, 2022 at 15:45

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.