Copying files interactively: “cp: overwrite”
I'm trying to figure out what words does the -i
nteractive shell of cp
accepts as input.
For your convenience, here's code that sets up files for experimentation.
touch example_file{1..3}
mkdir example_dir
cp example_file? example_dir
cp -i example_file? example_dir
The shell then asks interactively for each file whether it should be overwritten. It seems to accept all sorts of random input.
cp: overwrite 'example_dir/example_file1'? q
cp: overwrite 'example_dir/example_file2'? w
cp: overwrite 'example_dir/example_file3'? e
I tried looking into the source code of cp
, but I don't know C and searching for overwrite
is of no help.
As far as I can tell it accepts some words as confirmation for overwriting, and everything else is taken as a no. The problem is even words like ys
seem to be accepted as yes
, so I don't know what works and what doesn't.
I'd like to know how exactly does this work and to have some proof of it by means of documentation or intelligible snippets of source code.
shell cp interactive
New contributor
add a comment |
I'm trying to figure out what words does the -i
nteractive shell of cp
accepts as input.
For your convenience, here's code that sets up files for experimentation.
touch example_file{1..3}
mkdir example_dir
cp example_file? example_dir
cp -i example_file? example_dir
The shell then asks interactively for each file whether it should be overwritten. It seems to accept all sorts of random input.
cp: overwrite 'example_dir/example_file1'? q
cp: overwrite 'example_dir/example_file2'? w
cp: overwrite 'example_dir/example_file3'? e
I tried looking into the source code of cp
, but I don't know C and searching for overwrite
is of no help.
As far as I can tell it accepts some words as confirmation for overwriting, and everything else is taken as a no. The problem is even words like ys
seem to be accepted as yes
, so I don't know what works and what doesn't.
I'd like to know how exactly does this work and to have some proof of it by means of documentation or intelligible snippets of source code.
shell cp interactive
New contributor
In the interest of making this not too localized, I can accept unintelligible source code as well, but it will be hard for me to accept an answer if I can't be convinced of what the code is doing.
– Git Gud
12 hours ago
add a comment |
I'm trying to figure out what words does the -i
nteractive shell of cp
accepts as input.
For your convenience, here's code that sets up files for experimentation.
touch example_file{1..3}
mkdir example_dir
cp example_file? example_dir
cp -i example_file? example_dir
The shell then asks interactively for each file whether it should be overwritten. It seems to accept all sorts of random input.
cp: overwrite 'example_dir/example_file1'? q
cp: overwrite 'example_dir/example_file2'? w
cp: overwrite 'example_dir/example_file3'? e
I tried looking into the source code of cp
, but I don't know C and searching for overwrite
is of no help.
As far as I can tell it accepts some words as confirmation for overwriting, and everything else is taken as a no. The problem is even words like ys
seem to be accepted as yes
, so I don't know what works and what doesn't.
I'd like to know how exactly does this work and to have some proof of it by means of documentation or intelligible snippets of source code.
shell cp interactive
New contributor
I'm trying to figure out what words does the -i
nteractive shell of cp
accepts as input.
For your convenience, here's code that sets up files for experimentation.
touch example_file{1..3}
mkdir example_dir
cp example_file? example_dir
cp -i example_file? example_dir
The shell then asks interactively for each file whether it should be overwritten. It seems to accept all sorts of random input.
cp: overwrite 'example_dir/example_file1'? q
cp: overwrite 'example_dir/example_file2'? w
cp: overwrite 'example_dir/example_file3'? e
I tried looking into the source code of cp
, but I don't know C and searching for overwrite
is of no help.
As far as I can tell it accepts some words as confirmation for overwriting, and everything else is taken as a no. The problem is even words like ys
seem to be accepted as yes
, so I don't know what works and what doesn't.
I'd like to know how exactly does this work and to have some proof of it by means of documentation or intelligible snippets of source code.
shell cp interactive
shell cp interactive
New contributor
New contributor
New contributor
asked 12 hours ago
Git GudGit Gud
1183
1183
New contributor
New contributor
In the interest of making this not too localized, I can accept unintelligible source code as well, but it will be hard for me to accept an answer if I can't be convinced of what the code is doing.
– Git Gud
12 hours ago
add a comment |
In the interest of making this not too localized, I can accept unintelligible source code as well, but it will be hard for me to accept an answer if I can't be convinced of what the code is doing.
– Git Gud
12 hours ago
In the interest of making this not too localized, I can accept unintelligible source code as well, but it will be hard for me to accept an answer if I can't be convinced of what the code is doing.
– Git Gud
12 hours ago
In the interest of making this not too localized, I can accept unintelligible source code as well, but it will be hard for me to accept an answer if I can't be convinced of what the code is doing.
– Git Gud
12 hours ago
add a comment |
2 Answers
2
active
oldest
votes
The POSIX standard only specifies that the response need to be "affirmative" for the copying to be carried out when -i
is in effect.
For GNU cp
,
the actual input at that point is handled by a function called yesno()
. This function is defined in the lib/yesno.c
file in the gnulib source distribution, and looks like this:
bool
yesno (void)
{
bool yes;
#if ENABLE_NLS
char *response = NULL;
size_t response_size = 0;
ssize_t response_len = getline (&response, &response_size, stdin);
if (response_len <= 0)
yes = false;
else
{
/* Remove EOL if present as that's not part of the matched response,
and not matched by $ for example. */
if (response[response_len - 1] == 'n')
response[response_len - 1] = '';
yes = (0 < rpmatch (response));
}
free (response);
#else
/* Test against "^[yY]", hardcoded to avoid requiring getline,
regex, and rpmatch. */
int c = getchar ();
yes = (c == 'y' || c == 'Y');
while (c != 'n' && c != EOF)
c = getchar ();
#endif
return yes;
}
If NLS ("National Language Support") is not used, you can see that the only reply that the function returns true for is a response that starts with an upper or lower case Y
character. Any additional or other input is discarded.
If NLS is used, the rpmatch()
function is called to determine whether the response was affirmative or not. The purpose of the rpmatch()
NLS library function is to determine whether a given string is affirmative or not (with support for internationalisation).
On BSD systems, the corresponding function is found in src/bin/cp/utils.c
:
/*
* If the file exists and we're interactive, verify with the user.
*/
int
copy_overwrite(void)
{
int ch, checkch;
if (iflag) {
(void)fprintf(stderr, "overwrite %s? ", to.p_path);
checkch = ch = getchar();
while (ch != 'n' && ch != EOF)
ch = getchar();
if (checkch != 'y' && checkch != 'Y')
return (0);
}
return 1;
}
This is essentially the same as the non-NLS code path in the GNU code.
Thanks a lot. I was unable to find the source other than on opencoverage.net. Any chance you can link to it on git.savannah.gnu.org ? As I understand it (and correct me if I'm wrong), this is the closest to the truth that we can have (other than looking into what's inside one's machine), so a link there would be very much appreciated.
– Git Gud
12 hours ago
1
git.savannah.gnu.org/gitweb/…
– Jeff Schaller
12 hours ago
@JeffSchaller Thank you very much. I suggested an edit to the answer in order to include this.
– Git Gud
11 hours ago
add a comment |
If you look at the source code and search for interactive
you can see that it sets x.interactive = I_ASK_USER;
, so you can search in this and other files where I_ASK_USER
is checked.
In copy.c
you will find this symbol near a function call overwrite_ok
, and this function contains a call to a function yesno
.
The rest is left as an exercise for the reader. ;-)
I honestly appreciate the exercise, and even chuckled. Alas, I was unable to find the source code and for this reason I'm preferring Kusalananda's answer a little more. Thank you very much.
– Git Gud
12 hours ago
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Git Gud is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f504262%2fcopying-files-interactively-cp-overwrite%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
The POSIX standard only specifies that the response need to be "affirmative" for the copying to be carried out when -i
is in effect.
For GNU cp
,
the actual input at that point is handled by a function called yesno()
. This function is defined in the lib/yesno.c
file in the gnulib source distribution, and looks like this:
bool
yesno (void)
{
bool yes;
#if ENABLE_NLS
char *response = NULL;
size_t response_size = 0;
ssize_t response_len = getline (&response, &response_size, stdin);
if (response_len <= 0)
yes = false;
else
{
/* Remove EOL if present as that's not part of the matched response,
and not matched by $ for example. */
if (response[response_len - 1] == 'n')
response[response_len - 1] = '';
yes = (0 < rpmatch (response));
}
free (response);
#else
/* Test against "^[yY]", hardcoded to avoid requiring getline,
regex, and rpmatch. */
int c = getchar ();
yes = (c == 'y' || c == 'Y');
while (c != 'n' && c != EOF)
c = getchar ();
#endif
return yes;
}
If NLS ("National Language Support") is not used, you can see that the only reply that the function returns true for is a response that starts with an upper or lower case Y
character. Any additional or other input is discarded.
If NLS is used, the rpmatch()
function is called to determine whether the response was affirmative or not. The purpose of the rpmatch()
NLS library function is to determine whether a given string is affirmative or not (with support for internationalisation).
On BSD systems, the corresponding function is found in src/bin/cp/utils.c
:
/*
* If the file exists and we're interactive, verify with the user.
*/
int
copy_overwrite(void)
{
int ch, checkch;
if (iflag) {
(void)fprintf(stderr, "overwrite %s? ", to.p_path);
checkch = ch = getchar();
while (ch != 'n' && ch != EOF)
ch = getchar();
if (checkch != 'y' && checkch != 'Y')
return (0);
}
return 1;
}
This is essentially the same as the non-NLS code path in the GNU code.
Thanks a lot. I was unable to find the source other than on opencoverage.net. Any chance you can link to it on git.savannah.gnu.org ? As I understand it (and correct me if I'm wrong), this is the closest to the truth that we can have (other than looking into what's inside one's machine), so a link there would be very much appreciated.
– Git Gud
12 hours ago
1
git.savannah.gnu.org/gitweb/…
– Jeff Schaller
12 hours ago
@JeffSchaller Thank you very much. I suggested an edit to the answer in order to include this.
– Git Gud
11 hours ago
add a comment |
The POSIX standard only specifies that the response need to be "affirmative" for the copying to be carried out when -i
is in effect.
For GNU cp
,
the actual input at that point is handled by a function called yesno()
. This function is defined in the lib/yesno.c
file in the gnulib source distribution, and looks like this:
bool
yesno (void)
{
bool yes;
#if ENABLE_NLS
char *response = NULL;
size_t response_size = 0;
ssize_t response_len = getline (&response, &response_size, stdin);
if (response_len <= 0)
yes = false;
else
{
/* Remove EOL if present as that's not part of the matched response,
and not matched by $ for example. */
if (response[response_len - 1] == 'n')
response[response_len - 1] = '';
yes = (0 < rpmatch (response));
}
free (response);
#else
/* Test against "^[yY]", hardcoded to avoid requiring getline,
regex, and rpmatch. */
int c = getchar ();
yes = (c == 'y' || c == 'Y');
while (c != 'n' && c != EOF)
c = getchar ();
#endif
return yes;
}
If NLS ("National Language Support") is not used, you can see that the only reply that the function returns true for is a response that starts with an upper or lower case Y
character. Any additional or other input is discarded.
If NLS is used, the rpmatch()
function is called to determine whether the response was affirmative or not. The purpose of the rpmatch()
NLS library function is to determine whether a given string is affirmative or not (with support for internationalisation).
On BSD systems, the corresponding function is found in src/bin/cp/utils.c
:
/*
* If the file exists and we're interactive, verify with the user.
*/
int
copy_overwrite(void)
{
int ch, checkch;
if (iflag) {
(void)fprintf(stderr, "overwrite %s? ", to.p_path);
checkch = ch = getchar();
while (ch != 'n' && ch != EOF)
ch = getchar();
if (checkch != 'y' && checkch != 'Y')
return (0);
}
return 1;
}
This is essentially the same as the non-NLS code path in the GNU code.
Thanks a lot. I was unable to find the source other than on opencoverage.net. Any chance you can link to it on git.savannah.gnu.org ? As I understand it (and correct me if I'm wrong), this is the closest to the truth that we can have (other than looking into what's inside one's machine), so a link there would be very much appreciated.
– Git Gud
12 hours ago
1
git.savannah.gnu.org/gitweb/…
– Jeff Schaller
12 hours ago
@JeffSchaller Thank you very much. I suggested an edit to the answer in order to include this.
– Git Gud
11 hours ago
add a comment |
The POSIX standard only specifies that the response need to be "affirmative" for the copying to be carried out when -i
is in effect.
For GNU cp
,
the actual input at that point is handled by a function called yesno()
. This function is defined in the lib/yesno.c
file in the gnulib source distribution, and looks like this:
bool
yesno (void)
{
bool yes;
#if ENABLE_NLS
char *response = NULL;
size_t response_size = 0;
ssize_t response_len = getline (&response, &response_size, stdin);
if (response_len <= 0)
yes = false;
else
{
/* Remove EOL if present as that's not part of the matched response,
and not matched by $ for example. */
if (response[response_len - 1] == 'n')
response[response_len - 1] = '';
yes = (0 < rpmatch (response));
}
free (response);
#else
/* Test against "^[yY]", hardcoded to avoid requiring getline,
regex, and rpmatch. */
int c = getchar ();
yes = (c == 'y' || c == 'Y');
while (c != 'n' && c != EOF)
c = getchar ();
#endif
return yes;
}
If NLS ("National Language Support") is not used, you can see that the only reply that the function returns true for is a response that starts with an upper or lower case Y
character. Any additional or other input is discarded.
If NLS is used, the rpmatch()
function is called to determine whether the response was affirmative or not. The purpose of the rpmatch()
NLS library function is to determine whether a given string is affirmative or not (with support for internationalisation).
On BSD systems, the corresponding function is found in src/bin/cp/utils.c
:
/*
* If the file exists and we're interactive, verify with the user.
*/
int
copy_overwrite(void)
{
int ch, checkch;
if (iflag) {
(void)fprintf(stderr, "overwrite %s? ", to.p_path);
checkch = ch = getchar();
while (ch != 'n' && ch != EOF)
ch = getchar();
if (checkch != 'y' && checkch != 'Y')
return (0);
}
return 1;
}
This is essentially the same as the non-NLS code path in the GNU code.
The POSIX standard only specifies that the response need to be "affirmative" for the copying to be carried out when -i
is in effect.
For GNU cp
,
the actual input at that point is handled by a function called yesno()
. This function is defined in the lib/yesno.c
file in the gnulib source distribution, and looks like this:
bool
yesno (void)
{
bool yes;
#if ENABLE_NLS
char *response = NULL;
size_t response_size = 0;
ssize_t response_len = getline (&response, &response_size, stdin);
if (response_len <= 0)
yes = false;
else
{
/* Remove EOL if present as that's not part of the matched response,
and not matched by $ for example. */
if (response[response_len - 1] == 'n')
response[response_len - 1] = '';
yes = (0 < rpmatch (response));
}
free (response);
#else
/* Test against "^[yY]", hardcoded to avoid requiring getline,
regex, and rpmatch. */
int c = getchar ();
yes = (c == 'y' || c == 'Y');
while (c != 'n' && c != EOF)
c = getchar ();
#endif
return yes;
}
If NLS ("National Language Support") is not used, you can see that the only reply that the function returns true for is a response that starts with an upper or lower case Y
character. Any additional or other input is discarded.
If NLS is used, the rpmatch()
function is called to determine whether the response was affirmative or not. The purpose of the rpmatch()
NLS library function is to determine whether a given string is affirmative or not (with support for internationalisation).
On BSD systems, the corresponding function is found in src/bin/cp/utils.c
:
/*
* If the file exists and we're interactive, verify with the user.
*/
int
copy_overwrite(void)
{
int ch, checkch;
if (iflag) {
(void)fprintf(stderr, "overwrite %s? ", to.p_path);
checkch = ch = getchar();
while (ch != 'n' && ch != EOF)
ch = getchar();
if (checkch != 'y' && checkch != 'Y')
return (0);
}
return 1;
}
This is essentially the same as the non-NLS code path in the GNU code.
edited 5 hours ago
answered 12 hours ago
KusalanandaKusalananda
133k17254417
133k17254417
Thanks a lot. I was unable to find the source other than on opencoverage.net. Any chance you can link to it on git.savannah.gnu.org ? As I understand it (and correct me if I'm wrong), this is the closest to the truth that we can have (other than looking into what's inside one's machine), so a link there would be very much appreciated.
– Git Gud
12 hours ago
1
git.savannah.gnu.org/gitweb/…
– Jeff Schaller
12 hours ago
@JeffSchaller Thank you very much. I suggested an edit to the answer in order to include this.
– Git Gud
11 hours ago
add a comment |
Thanks a lot. I was unable to find the source other than on opencoverage.net. Any chance you can link to it on git.savannah.gnu.org ? As I understand it (and correct me if I'm wrong), this is the closest to the truth that we can have (other than looking into what's inside one's machine), so a link there would be very much appreciated.
– Git Gud
12 hours ago
1
git.savannah.gnu.org/gitweb/…
– Jeff Schaller
12 hours ago
@JeffSchaller Thank you very much. I suggested an edit to the answer in order to include this.
– Git Gud
11 hours ago
Thanks a lot. I was unable to find the source other than on opencoverage.net. Any chance you can link to it on git.savannah.gnu.org ? As I understand it (and correct me if I'm wrong), this is the closest to the truth that we can have (other than looking into what's inside one's machine), so a link there would be very much appreciated.
– Git Gud
12 hours ago
Thanks a lot. I was unable to find the source other than on opencoverage.net. Any chance you can link to it on git.savannah.gnu.org ? As I understand it (and correct me if I'm wrong), this is the closest to the truth that we can have (other than looking into what's inside one's machine), so a link there would be very much appreciated.
– Git Gud
12 hours ago
1
1
git.savannah.gnu.org/gitweb/…
– Jeff Schaller
12 hours ago
git.savannah.gnu.org/gitweb/…
– Jeff Schaller
12 hours ago
@JeffSchaller Thank you very much. I suggested an edit to the answer in order to include this.
– Git Gud
11 hours ago
@JeffSchaller Thank you very much. I suggested an edit to the answer in order to include this.
– Git Gud
11 hours ago
add a comment |
If you look at the source code and search for interactive
you can see that it sets x.interactive = I_ASK_USER;
, so you can search in this and other files where I_ASK_USER
is checked.
In copy.c
you will find this symbol near a function call overwrite_ok
, and this function contains a call to a function yesno
.
The rest is left as an exercise for the reader. ;-)
I honestly appreciate the exercise, and even chuckled. Alas, I was unable to find the source code and for this reason I'm preferring Kusalananda's answer a little more. Thank you very much.
– Git Gud
12 hours ago
add a comment |
If you look at the source code and search for interactive
you can see that it sets x.interactive = I_ASK_USER;
, so you can search in this and other files where I_ASK_USER
is checked.
In copy.c
you will find this symbol near a function call overwrite_ok
, and this function contains a call to a function yesno
.
The rest is left as an exercise for the reader. ;-)
I honestly appreciate the exercise, and even chuckled. Alas, I was unable to find the source code and for this reason I'm preferring Kusalananda's answer a little more. Thank you very much.
– Git Gud
12 hours ago
add a comment |
If you look at the source code and search for interactive
you can see that it sets x.interactive = I_ASK_USER;
, so you can search in this and other files where I_ASK_USER
is checked.
In copy.c
you will find this symbol near a function call overwrite_ok
, and this function contains a call to a function yesno
.
The rest is left as an exercise for the reader. ;-)
If you look at the source code and search for interactive
you can see that it sets x.interactive = I_ASK_USER;
, so you can search in this and other files where I_ASK_USER
is checked.
In copy.c
you will find this symbol near a function call overwrite_ok
, and this function contains a call to a function yesno
.
The rest is left as an exercise for the reader. ;-)
answered 12 hours ago
BodoBodo
1,993314
1,993314
I honestly appreciate the exercise, and even chuckled. Alas, I was unable to find the source code and for this reason I'm preferring Kusalananda's answer a little more. Thank you very much.
– Git Gud
12 hours ago
add a comment |
I honestly appreciate the exercise, and even chuckled. Alas, I was unable to find the source code and for this reason I'm preferring Kusalananda's answer a little more. Thank you very much.
– Git Gud
12 hours ago
I honestly appreciate the exercise, and even chuckled. Alas, I was unable to find the source code and for this reason I'm preferring Kusalananda's answer a little more. Thank you very much.
– Git Gud
12 hours ago
I honestly appreciate the exercise, and even chuckled. Alas, I was unable to find the source code and for this reason I'm preferring Kusalananda's answer a little more. Thank you very much.
– Git Gud
12 hours ago
add a comment |
Git Gud is a new contributor. Be nice, and check out our Code of Conduct.
Git Gud is a new contributor. Be nice, and check out our Code of Conduct.
Git Gud is a new contributor. Be nice, and check out our Code of Conduct.
Git Gud is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f504262%2fcopying-files-interactively-cp-overwrite%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
In the interest of making this not too localized, I can accept unintelligible source code as well, but it will be hard for me to accept an answer if I can't be convinced of what the code is doing.
– Git Gud
12 hours ago