解決策 1:
ほとんどの場合、これは次の方法で解決できます:
cp -R .[a-zA-Z0-9]* directory
これらの文字で始まらない隠しファイルがあるのは、かなり珍しいことです。
他のパターン マッチが利用可能です (.??*
、 .[^.]*
) - コメントを参照
解決策 2:
ディレクトリを移動するのに私のお気に入りは、一般的に次のとおりです。
tar cvf - . | (cd /dest/dir; tar xvf -)
現在のディレクトリを stdout に tar し、それをサブシェルにパイプして、stdin を untar する前に最初に宛先ディレクトリに cd します。シンプル、ダイレクト、拡張可能 - () を別のマシンへの ssh に置き換えるとどうなるかを考えてみてください。または、あなたの質問に答えるには:
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
解決策 3:
rsync
を使用できます .
rsync -a ./ /some/other/directory/
現在のディレクトリの内容をコピーします (ドット ファイルを含みますが、..
は含みません) )
解決策 4:
cp
での単純なシェル展開から離れてください。 コマンド ライン - シェル展開にはあらゆる種類の ahem があります 「興味深い」コーナー ケース (. および ..、スペース、印刷できないもの、ハードリンク、シンボリック リンクなどによって引き起こされる不要な再帰。) find
を使用します。 代わりに (findutils
に入っています) パッケージをインストールしていない場合に備えて - これは奇妙なことですが、すべてのディストリビューションがデフォルトでインストールします):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
段階的な説明:
-H
find
が発生します シンボリック リンクをたどらないこと (指定した実際のトップレベル ディレクトリ名がシンボリック リンクである場合を除きます。シンボリック リンクはたどります。)/path/to/toplevel/dir/
は、明らかに、バックアップしたい設定ファイルとディレクトリをホストするディレクトリのパスに置き換える必要があります。-maxdepth 1
find
を停止します 名前がドットで始まるディレクトリに再帰的に降りるのを防ぎます。再帰する必要はありませんcp
このレベルの名前だけが必要です。-name '.*'
find
に伝えます ドットで始まるすべての名前が必要です。環境変数POSIXLY_CORRECT
の場合、これは正しく機能しません が設定されていますが、めったに (あったとしても) 設定されていません。これは、これまでに指定した最初の一致条件です。a \( ....... \)
は and です 括弧内のより複雑な条件が続きます (私は ..... を使用して置き換えました。以下で説明します)。括弧をエスケープする必要があります。そうしないと、シェルによって (誤って) 解釈されるため、バックスラッシュが必要です。彼らの前で、-type d -o -type f -o -type l
or を含む 3 つの条件 それらの間の。-type d
ディレクトリに一致-type f
通常のファイルと-type l
に一致します シンボリックリンクに一致します。必要なものを選択できます。たとえば、設定ディレクトリをバックアップしたくない場合は、-type d
を省略します。 (そして-o
そのすぐ後ろです。)-exec ..... \;
find
に伝えます 一致するたびにコマンドを実行します。コマンドの最後はセミコロンでマークされます。シェルの解釈を避けるために、これもバックスラッシュでエスケープする必要があります。そのコマンドライン内で、{}
を使用する必要があります 現在遭遇した一致の名前をどこに終わらせたいか。シェルも中かっこを誤解する可能性があるため、'{}'
のようにアポストロフィで囲む必要があります。 .この場合に実行したいコマンドはcp -a '{}' /path/to/destination/dir/
です (-a はアーカイブを意味し、サブディレクトリで再帰し、シンボリック リンクをリンクとしてコピーし、権限と拡張属性を保持します。/path/to/destination/dir/
は明らかに宛先ディレクトリの名前です - 置き換えてください。)
つまり、平易な英語では、この find
コマンドラインはこれを言います:
/path/to/toplevel/dir/ から開始します。どのサブディレクトリにも降りないでください。名前がドットで始まるすべてのディレクトリ、ファイル、およびシンボリック リンクを検索します。見つかったそれぞれについて、/path/to/destination/dir/ にコピーし、性質、権限、および拡張属性を保持します。
解決策 5:
私は常に .??* を使用して、「。」を取得せずに隠しファイルを見つけました。と ".."。 「.a」か何かが欠落しているかもしれませんが、私はそれらの 1 つを持っていません.