How to append  folders with linux shell script implementation

Posted on 2013-05-11
Last Modified: 2013-05-12

   I have a lot of folders, lets say them directories. I want to add  a folder into those directories using shell script. How can I do? Thanks.
Question by:valgrind
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 7
  • 6
LVL 68

Expert Comment

ID: 39158617
Do you mean all first level directories below a given root directory?

If so, use this:

cd /root/dir

ls -l |grep ^d |awk '{print "mkdir", $NF "/newdir"}' | sh

Or do you have the directory names in a file, let's say "dirlist"?

Then use this:

xargs -I{} mkdir "{}/newdir" < dirlist

Author Comment

ID: 39158648
I am unfamiliar with shell script, but I suppose it must use for loop,Am I wrong? Let me explain my aim giving an example:

 I have  many folders with various names.:
/<  directory1_with_nameN >

I want to add a specific folder, which is named "myfolder" , into each of those folders.
I hope it makes sense.
How can I do it?
LVL 68

Expert Comment

ID: 39158660
There are implicit loops in my commands.

The first one prints out the mkdir command for every directory found and pipes it to sh for execution, and xargs in the second suggestion runs an implicit loop over the lines contained in the input file.

Your example doesn't specify a criterion which directories to process.

Every directory under a given folder? Down the whole tree or only the first level? Every directory starting with a common string?
NEW Veeam Agent for Microsoft Windows

Backup and recover physical and cloud-based servers and workstations, as well as endpoint devices that belong to remote users. Avoid downtime and data loss quickly and easily for Windows-based physical or public cloud-based workloads!


Author Comment

ID: 39158698
yes, every directory under a given folder.

Author Comment

ID: 39158703
not with a common string and only first level.

and   I wonder how can it be done down the whole tree:)
LVL 68

Expert Comment

ID: 39158712
OK, to take into account that there might be spaces in directory names let's use "find" and "xargs",
Both have an option to use binary zeroes as field separators ("-print0" resp. "-0") instead of spaces:

find /given/folder -type d -maxdepth 1 -print0 | xargs -0 -i{} echo mkdir "{}/myfolder"

And don't worry, there is a (yet not visible) loop implicitly constructed by "xargs".

To process the whole tree just omit the "-maxdepth 1" option of "find".

Author Comment

ID: 39158719
I think this is doing new directory, and adding it to the folders?
My aim is copying a folder and its contents into to all those folders.
I am doing another work now, so I can not try your solution, sorry for that.
LVL 68

Accepted Solution

woolmilkporc earned 500 total points
ID: 39158744
You wrote "add a folder" - that's ambiguous (to say the least).

Anyway, only a slight enhancement needed:

find /given/folder -type d -maxdepth 1 -print0 | xargs -0 -i{} cp -rp "/path/to/source/myfolder" "{}"

Author Comment

ID: 39158775
Thank you, and sorry for ambiguoity.

I will try, and reply.

Author Comment

ID: 39158817

The script is:

find -type d -maxdepth 1 -print() | xargs -() -i{} cp -rp "cse244directorstr""{}"

I had some errors:

egemen@egemen-VirtualBox:~/cse244gruplar/currentdir$ ./
./ line 2: syntax error near unexpected token `('
./ line 2: `find -type d -maxdepth 1 -print() | xargs -() -i{} cp -rp "cse244directorstr""{}"'
LVL 68

Expert Comment

ID: 39158824

"-print0" and "xargs -0"

where in both cases "0" means the digit "zero"!

And in the below line there must be a space before "{}"! Very important!

... "cse244directorstr"    "{}"

Further, you must specify the start directory for "find",
and shouldn't you specify the full path to the directory to be copied to the target folders?

find /start/dir-type d -maxdepth 1 -print0 | xargs -0 -i{} cp -rp "/path/to/cse244directorstr"  "{}"

Author Comment

ID: 39158872
I thought  start directory       or/and   "path/to......" can be evaluated as current directory if I omit relevant expressions. I was wrong. If these two were current directory, it would be nice.

But somehow it is usefull for me . I separated folders and "myfolder" so that they are not in current directory together.

Thank you.
LVL 68

Expert Comment

ID: 39159223
"find" requires a starting directory, there's no default. To specify the current directory use the dot ".":

find . -type d ... ...

In the second case you're right - without a path specification the current directory will be searched.

Thx for the points!


Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Network Interface Card (NIC) bonding, also known as link aggregation, NIC teaming and trunking, is an important concept to understand and implement in any environment where high availability is of concern. Using this feature, a server administrator …
SSH (Secure Shell) - Tips and Tricks As you all know SSH(Secure Shell) is a network protocol, which we use to access/transfer files securely between two networked devices. SSH was actually designed as a replacement for insecure protocols that sen…
Connecting to an Amazon Linux EC2 Instance from Windows Using PuTTY.
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.
Suggested Courses

734 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question