本記事は2021年9月12日時点のものです。
・コピー元フォルダの隠しファイルがコピー出来なくて困ってる人
社会人になり、Linuxを触り始めたのが10年以上前。それから幾度となくお世話になっているcpコマンド。
そのcpコマンドでこれまで全く気付かなかった仕様を先日確認したため、忘れないようにメモしておくことにします。(個人的備忘)
linuxのcpコマンドでフォルダ以下を「*」でコピーしようとしたとき、コピー元フォルダ直下にある隠しファイルはコピーされないことを初めて知った。。。
サブフォルダ直下にある隠しファイルはコピーされるという。
10年以上使ってるコマンドだけど、ビックリですわー。
— ぐーぐーぺこりんこ@食べるの専門㌠ (@gugupeco999) 2021年9月11日
コピー元フォルダ直下の隠しファイルがコピーできない!?
1 2 3 4 | +--topdir | +--.topdir_file | +--subdir | | +--.subdir_file |
findコマンドで確認すると、
1 2 3 4 5 | [root@samplesvr topdir]# find . . ./subdir ./subdir/.subdir_file ./.topdir_file |
というような感じ。
topdir配下のファイルをアスタリスク「*」指定でコピーしてみます。
1 2 3 4 5 | [root@samplesrv topdir]# cp -r ./* /tmp/hogehoge [root@samplesrv topdir]# find /tmp/hogehoge /tmp/hogehoge /tmp/hogehoge/subdir /tmp/hogehoge/subdir/.subdir_file |
すると、subdirフォルダ直下の隠しファイル(.subdir_file)がコピーできているのに対して、topdirフォルダ直下の隠しファイル(.topdir_file)がコピーできていないことが確認できます。
つまり、アスタリスク「*」を使って全てコピーと指定してもコピー元フォルダ直下の隠しファイルはコピーできないということ。

cpコマンドにちょっとした小細工することで対応可能
じゃ、どうやればコピーできるようになるの?ということですが、色々と調べた結果、以下のサイトに行き着きました。
(参考URL)
How to copy with cp to include hidden files and hidden directories and their contents?
参考URL先の情報より、
1 2 | cp -r /etc/skel/* /home/user cp -r /etc/skel/.[^.]* /home/user |
↑こんな感じにすれば、隠しファイルもコピーできるっぽい。
自分でもやってみた
早速試してみることに。
まず、
1 2 3 | [root@samplesrv topdir]# rm -rf /tmp/hogehoge/* [root@samplesrv topdir]# find /tmp/hogehoge /tmp/hogehoge |
コピー先のフォルダ内を全て削除して、試してみると・・・
1 2 3 4 | [root@samplesrv topdir]# cp -r ./.[^.]* /tmp/hogehoge [root@samplesrv topdir]# find /tmp/hogehoge /tmp/hogehoge /tmp/hogehoge/.topdir_file |
こんな感じでコピー元フォルダ直下の隠しファイル(.topdir_file)がコピーできることを確認。ただ、サブフォルダがコピーされていないことも確認。これではダメ。
・・・ということは、参照URL先に記載された通り、
1 2 | # cp -r ./* /tmp/hogehoge # cp -r ./.[^.]* /tmp/hogehoge |
cpコマンドを2回実行すれば、実現できるということのようです。バッチ組むときには気をつけておくべきポイントの一つになるかな。
