When I untar a tar.gz
file on Debian Lenny, I get the such outputs:
tar: openssl-1.0.1e/apps/openssl.cnf: time stamp 2013-02-11 15:26:04 is 1360584537.139999998 s in the future
openssl-1.0.1e/apps/openssl-vms.cnf
tar: openssl-1.0.1e/apps/openssl-vms.cnf: time stamp 2013-02-11 15:26:04 is 1360584537.129999998 s in the future
openssl-1.0.1e/apps/passwd.c
I see that the time stamp of the file is in the future comparing the system’s time. I use touch
as below to change the time stamp of the file, and stat
shows that the time stamp of the file is the system’s current time, then I attempt to untar the file, but I still get the same time stamp problem (as above).
ts7500:/home# touch -am openssl-1.0.1e.tar.gz
ts7500:/home# stat openssl-1.0.1e.tar.gz
File: `openssl-1.0.1e.tar.gz'
Size: 4459777 Blocks: 8736 IO Block: 4096 regular file
Device: 2b09h/11017d Inode: 40802 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 1970-01-01 03:15:24.000000000 +0000
Modify: 1970-01-01 03:15:24.000000000 +0000
Change: 1970-01-01 03:15:24.000000000 +0000
ts7500:/home# date
Thu Jan 1 03:15:48 UTC 1970
ts7500:/home# tar xvf openssl-1.0.1e.tar.gz
I know that I can solve the problem by changing the system’s time by date -s "08 JUN 2013 00:19:00"
or use NTP
. But I wonder, why changing the time stamp of the file by touch
did not work? how should I have changed the time stamp of the file, so that I would not have that warning?
If you want to see the file system:
ts7500:/home# blkid
/dev/nbd6: SEC_TYPE="msdos" UUID="01E8-4C7D" TYPE="vfat"
/dev/nbd8: UUID="236b63b3-15db-40c3-bc5f-e4b7c4b10751" TYPE="ext2"
/dev/nbd9: UUID="5b13aa84-e589-41a7-84cf-2d0d6bf2a9cd" TYPE="ext3"
ts7500:/home# df -Th
Filesystem Type Size Used Avail Use% Mounted on
tmpfs tmpfs 31M 4.0K 31M 1% /lib/init/rw
udev tmpfs 10M 160K 9.9M 2% /dev
tmpfs tmpfs 31M 0 31M 0% /dev/shm
rootfs rootfs 3.3G 1.7G 1.5G 53% /
/dev/root ext2 2.0M 1.7M 311K 85% /initrd
I’m getting an error installing bokeh 0.12.12. Previous versions install okay on my PC. I did a fresh install of Python 3.6.3 and deleted the pip cache directory first.
Windows 10 32-bit
Python 3.6.3 32-bit
Running pip install yields:
> pip install bokeh==0.12.12
Collecting bokeh==0.12.12
Using cached bokeh-0.12.12.tar.gz
Exception:
Traceback (most recent call last):
File "k:usersedappdatalocalprogramspythonpython36-32libtarfile.py", line 2268, in utime
os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
OSError: [WinError 87] The parameter is incorrect
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "k:usersedappdatalocalprogramspythonpython36-32libsite-packagespipbasecommand.py", line 215, in main
status = self.run(options, args)
File "k:usersedappdatalocalprogramspythonpython36-32libsite-packagespipcommandsinstall.py", line 324, in run
requirement_set.prepare_files(finder)
File "k:usersedappdatalocalprogramspythonpython36-32libsite-packagespipreqreq_set.py", line 380, in prepare_files
ignore_dependencies=self.ignore_dependencies))
File "k:usersedappdatalocalprogramspythonpython36-32libsite-packagespipreqreq_set.py", line 620, in _prepare_file
session=self.session, hashes=hashes)
File "k:usersedappdatalocalprogramspythonpython36-32libsite-packagespipdownload.py", line 821, in unpack_url
hashes=hashes
File "k:usersedappdatalocalprogramspythonpython36-32libsite-packagespipdownload.py", line 663, in unpack_http_url
unpack_file(from_path, location, content_type, link)
File "k:usersedappdatalocalprogramspythonpython36-32libsite-packagespiputils__init__.py", line 605, in unpack_file
untar_file(filename, location)
File "k:usersedappdatalocalprogramspythonpython36-32libsite-packagespiputils__init__.py", line 581, in untar_file
tar.utime(member, path)
File "k:usersedappdatalocalprogramspythonpython36-32libtarfile.py", line 2270, in utime
raise ExtractError("could not change modification time")
tarfile.ExtractError: could not change modification time
When I untar a tar.gz
file on Debian Lenny, I get the such outputs:
tar: openssl-1.0.1e/apps/openssl.cnf: time stamp 2013-02-11 15:26:04 is 1360584537.139999998 s in the future
openssl-1.0.1e/apps/openssl-vms.cnf
tar: openssl-1.0.1e/apps/openssl-vms.cnf: time stamp 2013-02-11 15:26:04 is 1360584537.129999998 s in the future
openssl-1.0.1e/apps/passwd.c
I see that the time stamp of the file is in the future comparing the system’s time. I use touch
as below to change the time stamp of the file, and stat
shows that the time stamp of the file is the system’s current time, then I attempt to untar the file, but I still get the same time stamp problem (as above).
ts7500:/home# touch -am openssl-1.0.1e.tar.gz
ts7500:/home# stat openssl-1.0.1e.tar.gz
File: `openssl-1.0.1e.tar.gz'
Size: 4459777 Blocks: 8736 IO Block: 4096 regular file
Device: 2b09h/11017d Inode: 40802 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 1970-01-01 03:15:24.000000000 +0000
Modify: 1970-01-01 03:15:24.000000000 +0000
Change: 1970-01-01 03:15:24.000000000 +0000
ts7500:/home# date
Thu Jan 1 03:15:48 UTC 1970
ts7500:/home# tar xvf openssl-1.0.1e.tar.gz
I know that I can solve the problem by changing the system’s time by date -s "08 JUN 2013 00:19:00"
or use NTP
. But I wonder, why changing the time stamp of the file by touch
did not work? how should I have changed the time stamp of the file, so that I would not have that warning?
If you want to see the file system:
ts7500:/home# blkid
/dev/nbd6: SEC_TYPE="msdos" UUID="01E8-4C7D" TYPE="vfat"
/dev/nbd8: UUID="236b63b3-15db-40c3-bc5f-e4b7c4b10751" TYPE="ext2"
/dev/nbd9: UUID="5b13aa84-e589-41a7-84cf-2d0d6bf2a9cd" TYPE="ext3"
ts7500:/home# df -Th
Filesystem Type Size Used Avail Use% Mounted on
tmpfs tmpfs 31M 4.0K 31M 1% /lib/init/rw
udev tmpfs 10M 160K 9.9M 2% /dev
tmpfs tmpfs 31M 0 31M 0% /dev/shm
rootfs rootfs 3.3G 1.7G 1.5G 53% /
/dev/root ext2 2.0M 1.7M 311K 85% /initrd
Posted by
on November 23, 2016
The GNU tape archive command, known as ‘tar’, is used to store many different files together into a single archive file. This makes it easy to perform backups and restores of files and directories in Unix/Linux based operating systems.
The practical examples in this guide will show you how to use the tar command in all sorts of different situations.
How To Use tar – Command Examples
-
1. Create Tar File
In its most simplest form, the tar command can be used to copy multiple files into a .tar file. The -c option is used to create a new archive file, while the -f option is used to specify the archive file to use (in this case, create).
[[email protected] ~]# tar -cf archive.tar test1.txt test2.txt [[email protected] ~]# ls -la -rw-r--r--. 1 root root 10240 Sep 2 12:26 archive.tar -rw-r--r--. 1 root root 52 Sep 2 12:24 test1.txt -rw-r--r--. 1 root root 18 Sep 2 09:42 test2.txt
The original files still exist after being added to the archive, they are not removed by default.
Note that we do not need the .tar extension, however we use it here to allow us to easily see what the file is.
-
2. List Contents Of Archive
We can list the contents within a tar file with the -t option. Note that we also need the -f option to specify the tar file to run against.
[[email protected] ~]# tar -tf archive.tar test1.txt test2.txt
-
3. Extract From Tar File
We can extract all contents of a tar file with the -x option. In this example, we show the contents of the original test2.txt file, wipe it clean, then extract the contents of archive.tar confirming that the contents of test2.txt have been returned from the copy in the archive.
[[email protected] ~]# cat test2.txt This is test2.txt [[email protected] ~]# > test2.txt [[email protected] ~]# cat test2.txt [[email protected] ~]# tar -xf archive.tar [[email protected] ~]# cat test2.txt This is test2.txt
This will not remove the .tar file, it will remain in place after extracting files from it.
-
4. Extract Tar File To Specific Directory
By default tar will extract to the current working directory which may not always be what we want. Rather than first cd to the destination directory, we can use the -C option which will change to the directory specified when performing the extraction for us.
[[email protected] ~]# mkdir new [[email protected] ~]# tar -xf archive.tar -C new/ [[email protected] ~]# ls -l new/ total 8 -rw-r--r--. 1 root root 52 Sep 2 12:24 test1.txt -rw-r--r--. 1 root root 18 Sep 2 09:42 test2.txt
-
5. Extract Specific Files From Tar File
Rather than extracting all contents of the tar file which is the default, we can specify a particular file to extract. In this example we first remove the files we extracted from the last example, then specifically extract just the test2.txt file only.
[[email protected] ~]# rm -f new/* [[email protected] ~]# tar -xf archive.tar -C new/ test2.txt [[email protected] ~]# ls -l new/ total 4 -rw-r--r--. 1 root root 18 Sep 2 09:42 test2.txt
We can also extract multiple files at once this way by adding more onto the end of the command.
-
6. Display Verbose Information
The -v option for verbose can be added to the tar command which will display useful additional information which may be useful when troubleshooting problems. Verbose output will print the files and directories that are being added to an archive or extracted from an archive.
[[email protected] ~]# tar -cvf archive.tar test1.txt test2.txt test1.txt test2.txt
This way we can visually see what has been added into the tar file without the need to list the contents with -t after the fact.
-
7. Delete From Archive
We can also remove files from within the tar file with the —delete option. In the below example we remove the test2.txt file then list the contents of archive.tar which now only has test1.txt left inside.
[[email protected] ~]# tar -f archive.tar --delete test2.txt [[email protected] ~]# tar -tf archive.tar test1.txt
-
8. Add More Files To Tar File
We can add additional files into an existing tar file with the -r option which will append files to the archive. In this example, we add our previously extracted test2.txt file back into the archive.
[[email protected] ~]# tar -f archive.tar -r new/test2.txt [[email protected] ~]# tar -tf archive.tar test1.txt new/test2.txt
Note that this has also copied the directory path, as shown in the output when we list the contents of the tar file. Now even if we completely delete the new directory, when we extract the contents of archive.tar the directory will be recreated from the archive.
[[email protected] ~]# rm -rf new/ [[email protected] ~]# tar -xf archive.tar [[email protected] ~]# ls -l new/ total 4 -rw-r--r--. 1 root root 18 Sep 2 09:42 test2.txt
-
9. Update Files Inside Archive
We can update the existing files inside a tar file with newer files on the file system with the -u option, it will only append files that are newer than the copy within the archive file.
In this example we append “new text” to new/test2.txt and then update the archive.tar file with this new file. We then delete the new/test2.txt file, extract it and restore it, then cat the contents to show that the copy from the archive was indeed updated.
[[email protected] ~]# echo "new text" >> new/test2.txt [[email protected] ~]# tar -uf archive.tar new/test2.txt [[email protected] ~]# rm -f new/test2.txt [[email protected] ~]# tar -xf archive.tar [[email protected] ~]# cat new/test2.txt This is test2.txt new text
-
10. Enable Archive Compression
While we could always compress a tar file after it has been created, the tar command provides options that allow us to compress the archive during creation.
We can use the -j option to compress with bzip2. This will set the archive extension to .tar.bz2, when I first ran the command I got the below error:
tar (child): bzip2: Cannot exec: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now
This was because the bzip2 package was not installed on my system, once installed with ‘yum install bzip2’ it worked properly.
[[email protected] ~]# tar -cjf archive.tar.bz2 test1.txt test2.txt
We can use the -J option to compress with xz. This will set the archive extension to .tar.xz
[[email protected] ~]# tar -cJf archive.tar.xz test1.txt test2.txt
We can use the -z option to compress with gzip, which seems to be the most common compression method used with tar. This will set the archive extension to .tar.gz
[[email protected] ~]# tar -czf archive.tar.gz test1.txt test2.txt
We can see that the compressed versions of archive.tar are a lot smaller than the original tar file, despite containing the same contents.
[[email protected] ~]# ls -la archive.tar* -rw-r--r--. 1 root root 10240 Sep 2 12:45 archive.tar -rw-r--r--. 1 root root 201 Sep 2 12:49 archive.tar.bz2 -rw-r--r--. 1 root root 190 Sep 2 12:47 archive.tar.gz -rw-r--r--. 1 root root 244 Sep 2 12:47 archive.tar.xz
We have previously investigated the performance differences of these compression methods if you’re interested in seeing which is best for you, compressing these small text files is not a good example to determine which is the best compression method, in general xz will compress better than bzip2, which will compress better than gzip.
We can extract from compressed archive files without specifying the option used to compress them, tar is smart enough to work this out on it’s own, so the below command is perfectly valid and will extract the content of this compressed archive file.
[[email protected] ~]# tar -xf archive.tar.gz
It’s important to note that we are not able to add additional files to compressed tar files, they would first need to be decompressed, updated, then manually compressed again with the gzip, bzip2, or xz commands.
[[email protected] ~]# tar -uf archive.tar.gz new/test2.txt tar: Cannot update compressed archives tar: Error is not recoverable: exiting now
-
11. Create Archive Of Directory
We don’t only have to add in individual files to a tar file, we can archive an entire directory recursively to archive all contents. In this example we copy all contents of the /etc/ directory to etc.tar.gz, afterwards we list the contents showing that this was successful.
[[email protected] ~]# tar -czf etc.tar.gz /etc/ tar: Removing leading `/' from member names [[email protected] ~]# ls -l etc.tar.gz -rw-r--r--. 1 root root 7092784 Sep 2 12:56 etc.tar.gz [[email protected] ~]# tar -tf etc.tar.gz | head etc/ etc/crypttab etc/mtab etc/resolv.conf etc/pki/ etc/pki/rpm-gpg/ etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7 etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7 etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
By default tar runs with the —recursion option, which will recurse into sub directories and archive the content within as well.
-
12. Disable Directory Recursion
As shown in the previous example when we archive a directory, sub directories and contents within are also archived by default. We can optionally disable directory recursion with the —no-recursion option, which will avoid descending into other directories automatically.
This example is the same as the previous, however we can see in the output that there are sub directories listed however no contents within them have been archived as we have only compressed files within the directory specified without recursion.
[[email protected] ~]# tar -czf etc-no-dirs.tar.gz /etc/* --no-recursion tar: Removing leading `/' from member names [[email protected] ~]# tar -tf etc-no-dirs.tar.gz | head etc/adjtime etc/aliases etc/aliases.db etc/alternatives/ etc/anacrontab etc/asound.conf etc/audisp/ etc/audit/ etc/avahi/ etc/bash_completion.d/
-
13. Differences Between Archive And File System
We can use the -d or —diff option to advise us if there is any difference between a file in an archive compared to a file on the file system. In this example we edit the test2.txt file and then perform the comparison, as we can see it reports that the modification time and file size differs. When we run the same against test1.txt which has not been changed, we get no output as there is no difference.
[[email protected] ~]# echo "change" >> test2.txt [[email protected] ~]# cat test2.txt This is test2.txt change [[email protected] ~]# tar -df archive.tar test2.txt test2.txt: Mod time differs test2.txt: Size differs [[email protected] ~]# tar -df archive.tar test1.txt [[email protected] ~]#
-
14. Keep Newer Files
When extracting we may not want to replace files on the file system that are newer than the ones stored in the tar file archive (the default action). We can specify —keep-newer-files to ensure that these newer files are not overwritten with older copies from the archive.
[[email protected] ~]# tar -xf archive.tar test2.txt --keep-newer-files tar: Current `test2.txt' is newer or same age
The test2.txt file has not been modified as the file on our file system has been changed after it was added to the archive.
-
15. Remove Files After Archiving
By default when we add files to an archive file the original files will remain on the file system. We can optionally remove the original files after adding them to the tar file with the —remove-files option. While this will delete the original files from the file system, they will exist within the tar file.
[[email protected] ~]# tar -cvf archive.tar test1.txt test2.txt --remove-files
-
16. Exclude Files By Pattern
We can exclude adding items into an archive with the —exclude option followed by a specified pattern. In the below example we can see we have two .txt files and a .mp3 file, we do not want to include the mp3 file in our archive so we exclude it.
[[email protected] new]# ls -l total 3336 -rw-r--r--. 1 root root 52 Sep 2 12:24 test1.txt -rw-r--r--. 1 root root 25 Sep 2 14:02 test2.txt -rw-r--r--. 1 root root 3407872 Sep 2 14:35 z.mp3 [[email protected] new]# tar -cvf exclude.tar --exclude=*.mp3 * test1.txt test2.txt
-
17. Confirm Before Adding Files
By default all specified files are added to an archive automatically without any further confirmation. We can optionally specify the -w option which will prompt us for a yes or no input confirmation for every file. In the below example, we enter no for test1.txt, and then confirm that it was indeed excluded from the tar file.
[[email protected] new]# tar -cwf confirm.tar * add `test1.txt'?n add `test2.txt'?y add `z.mp3'?y [[email protected] new]# tar -tf confirm.tar test2.txt z.mp3
This also works when extracting files from the archive.
[[email protected] new]# tar -xwf confirm.tar extract `test2.txt'?n extract `z.mp3'?y
-
18. POSIX ACL Support
POSIX ACL support for files within the archive can be enabled with the —acls option or disabled with the —no-acls option, —no-acls is used by default so if we want ACL support it must be specified.
In this example we use the setfacl command to set a basic ACL for user1 on test1.txt, we then create a tar file containing this file with —acls. After removing the original test1.txt file, we extract it and run getfacl and confirm that the ACL we added is still there.
[[email protected] new]# setfacl -m u:user1:rw test1.txt [[email protected] new]# getfacl test1.txt # file: test1.txt # owner: root # group: root user::rw- user:user1:rw- group::r-- mask::rw- other::r-- [[email protected] new]# tar -cf acls.tar test1.txt --acls [[email protected] new]# rm -f test1.txt [[email protected] new]# tar -xf acls.tar [[email protected] new]# getfacl test1.txt # file: test1.txt # owner: root # group: root user::rw- user:user1:rw- group::r-- mask::rw- other::r--
As we can see when using —acls, the file is extracted and the custom ACL for user1 still exists. We will now delete the file and export test1.txt from the tar file again without —acls and we will see that the ACL is no longer present on the file.
[[email protected] new]# rm -f test1.txt [[email protected] new]# tar -xf acls.tar [[email protected] new]# getfacl test1.txt # file: test1.txt # owner: root # group: root user::rw- group::rw- other::r--
-
19. Extended Attribute Support
Extended Attribute support for files within the archive can be enabled with the —xattrs option or disabled with the —no-xattrs option.
[[email protected] new]# tar -cf xattrs.tar test1.txt --xattrs
-
20. SELinux Support
SELinux support for files within the archive can be enabled with the —selinux option or disabled with the —no-selinux option.
[[email protected] new]# tar -cf no-selinux.tar * --no-selinux
-
21. Set New User/Group Owner Of Archived Files
We can set the user and/or group owner of a file when adding it into the archive with —owner=name to force new owner and —group=name to force a new group for the added files.
[[email protected] new]# tar -cf user-group-change.tar test2.txt --owner=user1 --group=user1
Now once we extract this file the user and group should be set to user1, rather than root.
[[email protected] new]# tar -xf user-group-change.tar [[email protected] new]# ls -l total 3364 -rw-rw-r--. 1 root root 52 Sep 2 12:24 test1.txt -rw-r--r--. 1 user1 user1 25 Sep 2 14:02 test2.txt
-
22. Extract Files To Standard Output
Rather than extracting files from within the tar file to the file system, we can simply send them to stdout instead with the -O option which may be useful if we just want to quickly read the contents of a file without having to extract it first.
[[email protected] new]# tar -xOf archive.tar test1.txt This is test1.txt [[email protected] new]# tar -xOf archive.tar test2.txt This is test2.txt
-
23. Check Archive File
We can attempt to verify an archive file during creation with the -W option.
[[email protected] new]# tar -cvWf archive.tar test1.txt test2.txt test1.txt test2.txt Verify test1.txt Verify test2.txt
Summary
As we have seen the tar command can be used to easily archive various files into a single archive file. When combined with the many options available we can perform powerful tasks allowing us to backup and restore files and directories.