年に基づいて名前が付けられたディレクトリがあり、テーマコードに基づくPDFファイルが含まれているとします。
ls
出力は次のとおりです
$ ls -l
total 32
drwxrwxrwx 1 root root 4096 Apr 8 08:52 May-June-2011
drwxrwxrwx 1 root root 4096 Apr 8 08:52 Nov-Dec-2011
drwxrwxrwx 1 root root 4096 Apr 8 20:36 Summer-2012
drwxrwxrwx 1 root root 4096 Apr 8 08:52 Summer-2013
drwxrwxrwx 1 root root 4096 Apr 8 08:52 Summer-2014
drwxrwxrwx 1 root root 4096 Apr 8 08:52 Winter-2012
drwxrwxrwx 1 root root 4096 Apr 8 08:52 Winter-2013
drwxrwxrwx 1 root root 4096 Apr 8 08:52 Winter-2014
各ディレクトリには、タイトルコードに従ってpdfファイルが含まれています。
ls -l May-June-2011/
total 808
-rwxrwxrwx 1 root root 104193 May 1 2011 161901.pdf
-rwxrwxrwx 1 root root 103380 May 1 2011 161902.pdf
-rwxrwxrwx 1 root root 115664 May 1 2011 161903.pdf
-rwxrwxrwx 1 root root 88953 May 1 2011 161904.pdf
-rwxrwxrwx 1 root root 179268 May 1 2011 161905.pdf
-rwxrwxrwx 1 root root 116158 May 24 2011 161906.pdf
-rwxrwxrwx 1 root root 106033 May 1 2011 161907.pdf
つまり、すべてのディレクトリに16190{1..7}.pdf
161901.pdf
ここで、上記のすべてのディレクトリのすべてのエントリを特定のディレクトリ(たとえばxyz
)に移動し、名前を親フォルダのname.pdfに変更したいとします。
説明する:-
以下はそのリストです161901.pdf
。
$ find -name 161901.pdf
./May-June-2011/161901.pdf
./Nov-Dec-2011/161901.pdf
./Summer-2012/161901.pdf
./Summer-2013/161901.pdf
./Summer-2014/161901.pdf
./Winter-2012/161901.pdf
./Winter-2013/161901.pdf
./Winter-2014/161901.pdf
./May-June-2011/161901.pdf
新しい名前(ファイルが置かれているディレクトリ名)に移動されたらと思います。つまり、次へxyz
May-June-2011.pdf
./May-June-2011/161901.pdf
./xyz/May-June-2011.pdf
同様に、./Nov-Dec-2011/161901.pdf
toなど(toまで)。./xyz/Nov-Dec-2011.pdf
./Summer-2012/161901.pdf
./xyz/Summer-2012.pdf
./Winter-2014/161901.pdf
./xyz/Winter-2014.pdf
予想される出力ls xyz
は次のとおりです。
$ls xyz
May-June-2011.pdf
Nov-Dec-2011.pdf
Summer-2012.pdf
Summer-2013.pdf
Summer-2014.pdf
Winter-2012.pdf
Winter-2013.pdf
Winter-2014.pdf
どうすればいいですか? (ループやその他の方法find -exec
または使用方法)
ベストアンサー1
PerlモジュールUnicode::戦い次の非常に便利なスクリプトが付属しています。名前を変更する(この名前はLinuxの標準と矛盾するので、これは不幸なことですrename(1)
。)それであなたは次のことをすることができます:
mkdir xyz
find . -name '*.pdf' -print0 | \
rename -0 's!^\.!xyz!; s!/[^/]*\.pdf$!.pdf!'
Perlがなくても、いくつかのシェルパイピングを使用して同じことを実行できます。
mkdir xyz
find . -name '*.pdf' | sed 's/^/mv /' >src
find . -name '*.pdf' | sed 's!^\./!xyz/!; s!/[^/]*\.pdf$!.pdf!' >dest
join src dest | sh -
rm -f src dest
そして、他の人がすぐに指摘すると確信していますが、<(...)
プロセス置換を使用して一行に入れることもできます。しかし、これが状況をより明確にするかどうかはわかりません。今日のコンピュータは、より詳細な構文を使用できるほど強力です。 ;)