隠しファイルを移動するためにmv(または*ワイルドカード)を取得するにはどうすればよいですか?


133

ホームディレクトリを古いシステムから新しいシステムに移行しています。作成したtarballには、.bashrcなどの隠しファイルを含むすべてが含まれています。ただし、解凍したtarball(/ tmpにある)の内容を新しいホームディレクトリに移動すると、隠しファイルはコピーされません(mv /tmp/home/rcook/* /home/rcook/)。どうすればmvを取得して移動できますか

実際、問題はmvにあるのではなく、bashのグロビングにあると思います。これを行う場合:

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

私はこれを見る:

a/:
.  ..  .foo

b/:
.  ..  bar

a/.foo移動しませんでした。では、隠しファイルを見つけるために*ワイルドカードを取得するにはどうすればよいですか?

はい、tarballをホームディレクトリに直接解凍できますが、tarballはに解凍されhome/rcook/....bashrc古いカスタマイズされたバージョンで新しいなどを上書きし、隠しファイルを見つけて移動する方法を知っていることを確認したいです価値のあるスキルです。提案?


いくつかの答えはのようなことを提案しますmv src/.* dest/。ただし、テストディレクトリでこれを試したところ、エラーが発生しました。で始まります:

rcook$ ls -a a/ b/
a/:
.  ..  bar  .foo

b/:
.  ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
.  ..  bar

b/:
.  ..  .foo

何が間違っていますか?


回答:


146

あなたはこれを行うことができます :

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

あなたは置くことができます

shopt -s dotglob

あなたの中で~/.bashrcあなたはそれがデフォルトになりたい場合。

http://mywiki.wooledge.org/globをご覧ください


ドットファイルをコピーする別の方法:

mv /tmp/home/rcook/.[!.]* /home/rcook/

..*一致するパターン..(親ディレクトリへのポインタ)を使用しないでください。名前が2つのドット(..something)で始まるファイルがある場合は、パターンも使用します..?*


質問の最後に追加したものをチェックしてください。ありがとう。
ランドールクック

1
何も問題は.なく..、特別なものです:それぞれ現在のディレクトリ親ディレクトリ。これは単なる警告です。活用のshopt -s dotglobソリューション
ジルQuenot

私は結局2つの動きをすることになりました:がmv home/rcook/* /home/rcook/続きmv home/rcook/.* /home/rcook/ます。これでうまくいきましたが、リンクをたどってドットグロブモードについて最初に読んでほしいと思います。それは私を一歩救ったでしょう。+1
ランドールクック

それでは、2番目のアプローチでは絶対パスを使用する必要がありますか?
franzlorenzon

3
あなたが使用している場合zshは、使用することができますグロブ修飾子またはシェルオプションをDGLOB_DOTS
mgalgs 14

43

追加ではエラーが発生しましたが、コードはまだ機能していました。追加する唯一のものは、あなたがそれを語っていることであるだけでドットファイルをコピーします。試してください:

mv src/* src/.* dst/

のエラーは引き続き表示されます。および..エントリ、これは問題ありません。しかし、移動は成功するはずです。

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move from/.’ to to/.’: Device or resource busy
mv: cannot remove from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test

1
良い点、@ AndrewSchwartz。私もこのアプローチが好きです。私はそれがより多くの認識に値すると思います。
ランドールクック

私はAmazon AWS CodeBuildで実行しているので、@ Drake Clarrisの回答がもう少し好きです。ゼロ以外のリターンコードにより、実際にビルドが停止しました。.hidden問題を解決するために明示的に持っていた1つのファイルを移動することになりました。
HeyWatchThis

ゼロ以外の終了コードに問題がある場合は、たとえば、追加することでそれを抑制することができます|| :||false / error、:is noopコマンドで次を実行することを意味します)。しかし、それは合法的なエラーも抑制します。例えば、宛先フォルダは存在しません。私が使用して、よりエレガントな方法を見つけることができませんmv除外する.と、..エントリを。私にとってcpの大きな利点は、新しいファイルをディスクに書き込まないことです。
アンドリューシュワルツ

10

あなたの場合はls -lディレクトリで、次のように表示されます.し、..リストされたファイルの中。そのため、mv .* /destこれらのポインターを考慮に入れていると思います。試してください:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

これは、それらの現在および親のディレクトリポインターを無視します。

あなたは3つのパターンのいずれかの場合は、エラーを取得します*[^.]*または..?*あなただけの一致するものを含める必要がありますので、何のファイルと一致しません。


いいね このスタイルのグロビングに関する同様の回答は、ここにあります:superuser.com/a/784046/144977。これを投稿してくれてありがとう。
phyatt

7

私が考えることができる2つの可能な解決策。1つは、現在のディレクトリを宛先にコピーして、再帰オプションで代わりにcpを使用することです。

cp -Rp . /desired/directory

その後、現在のディレクトリのソースファイルを削除できます

または、ファイルの名前が同じであることがわかっている場合(スペース、ワイルドカード、印刷できない文字がない場合)、次のようにすることができます

mv $(ls -A) /desired/directory

4
ソースとターゲットが同じファイルシステム上にある場合、Copy-then-removeはmoveとは大きく異なります。少なくとも、-pメタデータを保持するオプションを含めます。使用lsは最後の手段である必要があります。ここには、より良い、より簡単な方法があります。
ジル

2

Linuxには「隠された」ファイルのようなものはありません。ドットで始まるファイルは、デフォルトではファイルリストから非表示になっています。

でもグロブでファイルをコピーするには、使用してファイル接頭辞に必要.なようにmv -u .* fooして、.fooとしてappearnますfoo/.foo移動したとき。

-uオプションは、ソースが新しい場合、または宛先が欠落している場合にのみファイルを移動します。それとも、ただの移動に関するエラーを無視でき.し、..彼らは特別なファイルであり、移動することはできませんが、中に巻き込まないよう.*、シェルによってグロブ。


質問の最後に追加したものをチェックしてください。ありがとう。
ランドールクック

0

だから私たちは持っています:

a
|-- .foo
`-- bar

そして:

b

私が取った膨大な時間がここにすべての答えよりもよりよい解決策を見つけること。

次に、このコマンドに30秒かかりました。

$ mv --help

それから私は私の愛を見つけました:

$ mv a/ b/ -T

注:私も議論を理解していません-T。それはちょうど私が必要なことをしました。ここでそれは言う:

-T、-no-target-directoryはDESTを通常のファイルとして扱います


1
スラッシュを省略した場合、必要はありません-T。いずれにせよ、これは基本的にmvにディレクトリ内からすべてのファイルを移動するのではなく、ディレクトリ自体を移動するように指示しています。
thomasrutter

@thomasrutter、ディレクトリ自体の移動は名前の変更と同じではないですか?
ランドールクック

3
はい、親宛先が同じままである場合、本質的には単に名前を変更しています。それをどのように参照しても、ディレクトリのファイル特定の場所に移動することに関する元の質問にはおそらく答えられません。
-thomasrutter

0

私の場合、私は単純にmv単一の隠しファイルを試していましたが、これが解決策でした:

FILE=.myHiddenFile
mv "$FILE" dest/

説明

最初は私が試していました:

mv .myHiddenFile dest/

しかし、それはエラーを生成し続けました:

mv: cannot stat '.myHiddenFile': No such file or directory

ls -alファイルがdest/存在することを示していても。

その理由は、シェルが「。」を解釈していたためだと思われます。ファイル名に含まれているため、変数に移動することで解釈を回避します。これを解決する方法はおそらく他にもありますが、これで十分でした。


-1

隠しファイルを含むファイルを現在のディレクトリにコピーする場合。

cp -Rp source-directory/. .

1
これは、2013年のドレイククラリスの回答と非常によく似ています。他に追加することはありますか?
ランドールクック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.